【问题标题】:Access JDBC Connection from jOOQ transaction从 jOOQ 事务访问 JDBC 连接
【发布时间】:2016-02-12 09:00:42
【问题描述】:

是否可以从 jOOQ TransactionRunnableTransactionCallable 中访问底层 JDBC 连接?

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

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

因为您只能访问 ConnectionProvider,如果我调用 aquire(),看起来我的 LOB 最终将不会与我的语句获得相同的连接。

【问题讨论】:

  • 实现你自己的连接提供者并提供一种方法来访问最后/当前/任何连接?
  • 这听起来比我现在使用的普通 JDBC 做的工作更多。澄清一下,问题是 jOOQ API 是否支持获取当前连接而我只是找不到它,或者它不支持它。

标签: java jdbc jooq


【解决方案1】:

在 jOOQ 3.7 中,实现了#4552 以允许通过ConnectionRunnable 访问ConfigurationConnection。例如:

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 相同

【讨论】:

  • 谢谢卢卡斯。我正在使用 3.5,所以我想我暂时会坚持使用 getSql() 和普通 JDBC,但很高兴知道。
猜你喜欢
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 2017-07-11
  • 2010-10-03
  • 2023-03-27
相关资源
最近更新 更多