我有一个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后死亡时,我假设连接被返回到池中,并且当创建新线程时,可以重新使用连接。但是当我列出我的网络连接时,列表会随着创建更多线程而不断增长。上面创建的连接是否正确返回到池中,如果是这样,我如何强制重新使用连接?
答案 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为您提供removeAbandoned
和removeAbandonedTimeout
配置参数。这些不会立即返回到池中的连接,因此您仍然可以看到连接数量在超时到期之前增长(并且希望,因为您处于紧急循环中,所以&#39; ve设置打开连接数的最大值。