如何使用jOOQ获取事务中的底层连接?

sar*_*gue 8 java transactions jdbc jooq java-8

我在现有项目中使用jOOQ,它也使用一些自定义JDBC代码.在jOOQ事务中,我需要调用其他一些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, ...);
});
Run Code Online (Sandbox Code Playgroud)

阅读文档并在源代码上略微窥视我最好的选择是:

configuration.connectionProvider().acquire()
Run Code Online (Sandbox Code Playgroud)

但这个名称在这个特定的用例中有点误导.我不想要一个新的连接,只需要当前的连接.我认为这是要走的路,因为配置是派生的,我将始终得到相同的连接,但我不确定,我在文档中找不到答案.

Luk*_*der 3

jOOQ 的 API 不对“当前”连接的存在做出任何假设。根据您的具体实现ConnectionProviderTransactionProvider等等,这可能是可能的,也可能是不可能的。

不过,您的解决方法通常很好。只要确保您遵守ConnectionProviderSPI 合同即可:

Connection c = null;
try {
    c = configuration.connectionProvider().acquire();
    someOtherCode(c, ...);
}
finally {
    configuration.connectionProvider().release(c);
}
Run Code Online (Sandbox Code Playgroud)

DefaultTransactionProvider例如,当您使用 jOOQ's 时,上面的内容就很好。

请注意,有一个待处理的功能请求#4552ConnectionProvider ,它将允许您在 a及其对 和 的调用的acquire()上下文中运行代码release()。它将如下所示:

DSL.using(configuration)
   .connection(c -> someOtherCode(c, ...));
Run Code Online (Sandbox Code Playgroud)