如何在jdbc池中强制重用连接?

时间:2012-09-26 20:34:47

标签: java mysql jdbc

我有一个Runnable,它从连接池获取连接,如下所示,有60秒的时间来处理连接:

private static ConnectionPoolDataSource cpds; // MysqlConnectionPoolDataSource

public void run(){
    while((System.currentTimeMillis()-created)<60000){
        try(Connection conn = cpds.getPooledConnection().getConnection()){  
            //do something
        }catch(SQLException sqle){}
    }
}

当线程在60s后死亡时,我假设连接被返回到池中,并且当创建新线程时,可以重新使用连接。但是当我列出我的网络连接时,列表会随着创建更多线程而不断增长。上面创建的连接是否正确返回到池中,如果是这样,我如何强制重新使用连接?

2 个答案:

答案 0 :(得分:4)

您实际上并未使用连接池。 ConnectionPoolDataSource不打算直接使用。它旨在作为DataSource对象的{特殊} PooledConnection,然后通过提供连接池的(普通)DataSource实现保存在连接池中。

普通开发人员不应直接使用ConnectionPoolDataSource,它应与Application Server提供的连接池一起使用,或者包含在提供连接池的通用DataSource中。

当从连接池请求Connection时,它会签出现有的PooledConnection(或从ConnectionPoolDataSource请求新的),检索Connection和将其返回给用户。当用户关闭Connection时,PooledConnection会向连接池发出信号,表明它已再次可用。

在这种情况下,您要创建PooledConnection,从中检索Connection,然后放弃PooledConnection。这意味着PooledConnection被放弃了,它与数据库的物理连接不能被重用,并且当它最终被垃圾收集时将被关闭/丢弃(通常当连接池想要关闭物理连接时,它将调用close()上的PooledConnection

您需要使用Application Server提供的连接池,或使用DBCP,c3p0或BoneCP等通用连接池。

答案 1 :(得分:1)

您不会说出您在连接池中使用的内容,因此答案是&#34;也许。&#34;

但是,大多数池都有一些方法来检测废弃的连接。例如,DBCP为您提供removeAbandonedremoveAbandonedTimeout配置参数。这些不会立即返回到池中的连接,因此您仍然可以看到连接数量在超时到期之前增长(并且希望,因为您处于紧急循环中,所以&#39; ve设置打开连接数的最大值。