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

时间:2015-09-07 09:54:20

标签: java jdbc transactions java-8 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()

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

1 个答案:

答案 0 :(得分:2)

jOOQ的API没有假设存在"当前"连接。根据您ConnectionProviderTransactionProvider等的具体实施情况,这可能会也可能不会。

但是你的解决方法通常很好。请确保遵循ConnectionProvider的SPI合同:

Connection c = null;
try {
    c = configuration.connectionProvider().acquire();
    someOtherCode(c, ...);
}
finally {
    configuration.connectionProvider().release(c);
}

例如,当您使用jOOQ' DefaultTransactionProvider时,上述情况很好。

请注意,有一项待处理的功能请求#4552,可让您在ConnectionProvider及其对acquire()release()的调用的上下文中运行代码。这就是它的样子:

DSL.using(configuration)
   .connection(c -> someOtherCode(c, ...));