jooq连接池不释放连接

时间:2016-06-22 15:20:00

标签: mysql c3p0 jooq apache-commons-dbcp

我们尝试在我们的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做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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

...写道:

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

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

相关问题