如何使用 jOOQ 获取事务内部的底层连接?
How to get the underlying connection inside a transaction using jOOQ?
我在现有项目中使用 jOOQ,该项目也使用一些自定义 JDBC 代码。在 jOOQ transaction 中,我需要调用其他一些 JDBC 代码,并且我需要通过活动连接,以便所有内容都进入同一事务。
我不知道如何检索 jOOQ 事务中的底层连接。
create.transaction(configuration -> {
DSLContext ctx = DSL.using(configuration);
// standard jOOQ code
ctx.insertInto(...);
// now I need a Connection
Connection c = ctx.activeConnection(); // not real, this is what I need
someOtherCode(c, ...);
});
阅读文档并浏览一下源代码,我最好的选择是:
configuration.connectionProvider().acquire()
但是这个名字在这个特定的用例中有点误导。我不想要新的连接,只想要当前的连接。我认为这是要走的路,因为配置是派生的,我总是会得到相同的连接,但我不确定,我在文档中找不到答案。
jOOQ 的API 不假设"current" 连接的存在。根据您对 ConnectionProvider
、TransactionProvider
等的具体实施,这可能会也可能不会。
不过,您的解决方法通常没问题。请确保您遵循 ConnectionProvider
的 SPI 合同:
Connection c = null;
try {
c = configuration.connectionProvider().acquire();
someOtherCode(c, ...);
}
finally {
configuration.connectionProvider().release(c);
}
例如,当您使用 jOOQ 的 DefaultTransactionProvider
时,上面的内容很好。
请注意,有一个待处理的功能请求 #4552 允许您在 ConnectionProvider
及其对 acquire()
和 [= 的调用的上下文中 运行 代码18=]。这就是它的样子:
DSL.using(configuration)
.connection(c -> someOtherCode(c, ...));
我在现有项目中使用 jOOQ,该项目也使用一些自定义 JDBC 代码。在 jOOQ transaction 中,我需要调用其他一些 JDBC 代码,并且我需要通过活动连接,以便所有内容都进入同一事务。
我不知道如何检索 jOOQ 事务中的底层连接。
create.transaction(configuration -> {
DSLContext ctx = DSL.using(configuration);
// standard jOOQ code
ctx.insertInto(...);
// now I need a Connection
Connection c = ctx.activeConnection(); // not real, this is what I need
someOtherCode(c, ...);
});
阅读文档并浏览一下源代码,我最好的选择是:
configuration.connectionProvider().acquire()
但是这个名字在这个特定的用例中有点误导。我不想要新的连接,只想要当前的连接。我认为这是要走的路,因为配置是派生的,我总是会得到相同的连接,但我不确定,我在文档中找不到答案。
jOOQ 的API 不假设"current" 连接的存在。根据您对 ConnectionProvider
、TransactionProvider
等的具体实施,这可能会也可能不会。
不过,您的解决方法通常没问题。请确保您遵循 ConnectionProvider
的 SPI 合同:
Connection c = null;
try {
c = configuration.connectionProvider().acquire();
someOtherCode(c, ...);
}
finally {
configuration.connectionProvider().release(c);
}
例如,当您使用 jOOQ 的 DefaultTransactionProvider
时,上面的内容很好。
请注意,有一个待处理的功能请求 #4552 允许您在 ConnectionProvider
及其对 acquire()
和 [= 的调用的上下文中 运行 代码18=]。这就是它的样子:
DSL.using(configuration)
.connection(c -> someOtherCode(c, ...));