从jOOQ事务访问JDBC连接

时间:2015-11-11 09:33:12

标签: java jdbc jooq

是否可以从jOOQ TransactionRunnableTransactionCallable中访问基础JDBC连接?

我希望能够访问从连接中获得的PostgreSQL大对象API:

final LargeObjectManager manager = connection.unwrap(PGConnection.class).getLargeObjectAPI();

如果我打电话给ConnectionProvider,你只能访问aquire(),看起来我的LOB和我的语句的连接不一样。

1 个答案:

答案 0 :(得分:3)

在jOOQ 3.7中,#4552已实施,允许通过ConnectionRunnable访问Configuration Connection。例如:

DSL.using(configuration)
   .transaction((Configuration c) -> {
       DSL.using(c).connection(connection -> {
           LargeObjectManager manager = connection.unwrap(PGConnection.class).getLargeObjectAPI();
           // ...
       });
   });

为方便起见,此API将在内部调用acquire()release(),因此以下解决方案相同但更详细:

DSL.using(configuration)
   .transaction((Configuration c) -> {
       Connection connection = c.connectionProvider().acquire();
       try {
           LargeObjectManager manager = connection.unwrap(PGConnection.class).getLargeObjectAPI();
           // ...
       }
       finally {
           c.connectionProvider().release(connection);
       }
   });

因为Connection来自"交易" Configuration c,您可以确定您将访问权限Connection。即使你多次访问它,它也总是与jOOQ内部取代你自己的ConnectionProvider替换DefaultConnectionProvider作用于交易Connection