我有一个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){}
}
}
Run Code Online (Sandbox Code Playgroud)
当线程在60s之后死掉时,我假设连接将返回到池中,并且当创建新线程时,可以重新使用该连接。但是,当我列出我的网络连接时,随着创建更多线程,列表会不断增长。如上创建的连接是否可以正确返回到池中,如果可以,我如何强制重新使用连接?
您实际上并没有使用连接池。A ConnectionPoolDataSource不能直接使用。其目的是作为一个(特殊)DataSource为PooledConnection对象,然后由一个(正常)保存在连接池DataSource的实现,提供了连接池。
普通开发人员不应ConnectionPoolDataSource直接使用它,而是应将其与Application Server提供的连接池一起使用,或包装到DataSource提供连接池的通用容器中。
当Connection从连接池中PooledConnection请求a时,它将检出一个现有的(或从中请求一个新的ConnectionPoolDataSource),检索a Connection并将其返回给用户。当用户关闭时Connection,PooledConnection会向连接池发出信号,表明它再次可用。
在这种情况下,您要创建一个PooledConnection,Connection从中检索一个,然后将其丢弃PooledConnection。这意味着PooledConnection被抛弃,而到数据库的物理连接,不能重复使用,将被关闭/丢弃,当它终于垃圾收集(通常是当连接池要关闭物理连接,它会调用close()的PooledConnection)。
您要么需要使用Application Server提供的连接池,要么使用诸如DBCP,c3p0或BoneCP之类的通用连接池。