1

我有一个 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){}
    }
}

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

4

2 回答 2

5

您实际上并没有使用连接池。AConnectionPoolDataSource不打算直接使用。它旨在作为(特殊)DataSource对象PooledConnection,然后通过提供连接池的(正常)DataSource实现将其保存在连接池中。

一个普通的开发者不应该直接使用 a ,它的目的是与 Application Servers 提供的连接池一起使用,或者被包装到提供连接池的ConnectionPoolDataSource通用s 中。DataSource

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

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

您要么需要使用应用服务器提供的连接池,要么使用 DBCP、c3p0 或 BoneCP 等通用连接池。

于 2012-09-29T08:24:26.233 回答
1

你没有说你使用的是什么连接池,所以答案是“也许”。

但是,大多数池都有一些方法来检测废弃的连接。例如,DBCP为您提供removeAbandonedremoveAbandonedTimeout配置参数。这些不会立即将连接返回到池,因此您仍然会看到连接数在超时到期之前一直在增长(并且希望,由于您处于紧密循环中,因此您已经设置了最大连接数打开连接)。

于 2012-09-26T20:46:03.853 回答