2016-06-22 94 views
0

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

我们初始化像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); 

营造语句如下:

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来做到这一点?

+0

这听起来像你不是事实上close()ing连接可以。你在使用[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)吗? –

回答

1

使用jOOQ完成此任务的最简单方法是将数据源直接传递给jOOQ。相反的:

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

...写信:

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

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