【问题标题】:jooq connection pooling does not release connectionjooq 连接池不释放连接
【发布时间】:2016-10-24 15:22:57
【问题描述】:

我们尝试在我们的 jooq 环境中使用 dbcp 和 c3p0 作为数据库连接池。两者都适用于 SELECT 语句,但 CREATE 和 UPDATE 语句不会释放连接。

我们像这样初始化dbcp:

public static DataSource setupDataSource(String dbUrl, String dbUserName, String dbPassword) {
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(dbUrl, dbUserName, dbPassword);
    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, null);
    ObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(poolableConnectionFactory);
    poolableConnectionFactory.setPool(connectionPool);
    PoolingDataSource<PoolableConnection> dataSource = new PoolingDataSource<>(connectionPool);
    return dataSource;
}

然后我们得到每个查询的连接:

Connection dbConnection = null;
    try {
        dbConnection = dataSource.getConnection();
} ....
DSLContext dslContext = DSL.using(connection, dialect);

Out create 语句如下所示:

protected final DSLContext jooq;
public E add(E entity) throws Exception {
    E transformedEntity = null;
    try {
        R persisted;
        persisted = jooq.insertInto(transformator.getTable())
                .set(transformator.createRecord(entity))
                .returning()
                .fetchOne();

        transformedEntity = transformator.getEntityFromTableRecord(persisted);
    } catch (DataAccessException e) {
        ...
    }
    return transformedEntity;
}

最后我们关闭连接:

dbConnection.close();

问题是连接保持打开状态,连接池已满后无法创建连接。我需要关闭语句和结果集吗?如果是的话,我怎么能用 jooq 做到这一点?

【问题讨论】:

  • 听起来你实际上并没有 close()ing Connections reliable。你在用try-with-resources吗?

标签: mysql c3p0 jooq apache-commons-dbcp


【解决方案1】:

使用 jOOQ 最简单的方法是将数据源直接传递给 jOOQ。而不是:

Connection dbConnection = null;
    try {
        dbConnection = dataSource.getConnection();
} ....
DSLContext dslContext = DSL.using(connection, dialect);

...写:

DSLContext dslContext = DSL.using(dataSource, dialect);

这样,jOOQ 将为您管理连接生命周期。否则,我怀疑您只是在某些情况下您的连接仍然泄漏并且没有正确关闭

【讨论】:

  • 那么关闭DSLContext后Connection会返回到Connection Pool吗?
  • @M.Soldin:为什么要关闭DSLContext?使用 jOOQ 时,您不需要管理任何资源。 jOOQ 在幕后为您关闭 JDBC Connection 实例。
  • 我有多个线程访问数据库资源。在一个线程完成数据库访问后,它应该返回资源。我认为这将是池实现的方式。或者是否可以通过多个线程访问 DSLContext?
  • 您的连接池完全在DataSource API 后面实现。 jOOQ 会方便地为您拨打DataSource.getConnection()Connection.close() 电话,因此您不必担心。是的,如果您的 DataSource 可以处理此问题,您可以在多个线程之间共享 DSLContext 实例。
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2014-08-06
  • 2013-05-01
  • 2012-04-22
  • 1970-01-01
  • 2015-07-29
  • 2017-05-26
相关资源
最近更新 更多