java - Jooq 使用现有连接进行 fetchOne 或执行

标签 java jdbc playframework-2.0 jooq

我尝试在 play 框架内自行管理连接,并将 jooq 连接提供程序实现为:

public class PlayConnectionProvider implements ConnectionProvider {

  private Connection connection = null;

  @Override
  public Connection acquire() throws DataAccessException {
    if (connection == null) {
      connection = DB.getConnection();
    }
    return connection;
  }

  @Override
  public void release(Connection released) throws DataAccessException {
    if (this.connection != released) {
      throw new IllegalArgumentException("Expected " + this.connection + " but got " + released);
    }
    try {
      if (connection.getAutoCommit() == true) {
        connection.close();
        connection = null;
      }
    } catch (SQLException e) {
      Logger.error("Error closing connection " + connection, e);
    }
  }
}

但是,当我调用execute()时,jooq似乎总是会调用acquire()并创建一个新连接,而不是使用现有连接。我发现新的连接是通过execute()函数中的DefaultExecuteContext获取的:

public final Connection connection() {
    ConnectionProvider provider = this.connectionProvider != null?this.connectionProvider:this.configuration.connectionProvider();
    if(this.connection == null && provider != null) {
        this.connection(provider, provider.acquire());
    }

    return this.connection;
}

有什么方法可以配置execute()的连接吗?

最佳答案

你说得对,jOOQ 总是打电话 acquire()在每个 execute() 调用的开始处。但它也调用 release()最后,您似乎正在自己重置缓存的连接

if (connection.getAutoCommit() == true) {
    connection.close();
    connection = null;
}

...因为 Play 的 DB.getConnection() 返回一个打开自动提交的连接

关于线程安全的说明

请注意,如果您以这种方式缓存连接,ConnectionProvider 将不再是线程安全的,因此包含它的所有对象也将不再是线程安全的(包括 Configuration and DSLContext )。维护线程安全的一种方法是将连接存储在 ConnectionProvider

内的 ThreadLocal

关于java - Jooq 使用现有连接进行 fetchOne 或执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27663548/

相关文章:

java - 如何创建基于 Java 的 Play 框架应用程序(非 Scala)

java - GWT Context2d 线宽

java - 该代码是否会对 MySQL 可用连接产生任何影响?

java - 通过代理使用 JDBC 驱动程序连接到 MySQL

scala - 停止框架使用 HTTP 代理

scala - 防止 Play 模板引擎转义 JavaScript 引号

java - 如何按自定义 ArrayAdapter 所基于的对象的变量对它的内容进行排序?

java - Java API 和库之间有什么区别?

Java - Spintax,我该怎么办?

Java/JDBC – 多参数搜索最佳实践