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

Sri*_*har 1 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){}
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*eel 5

您实际上并没有使用连接池。A ConnectionPoolDataSource不能直接使用。其目的是作为一个(特殊)DataSourcePooledConnection对象,然后由一个(正常)保存在连接池DataSource的实现,提供了连接池。

普通开发人员不应ConnectionPoolDataSource直接使用它,而是应将其与Application Server提供的连接池一起使用,或包装到DataSource提供连接池的通用容器中。

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

在这种情况下,您要创建一个PooledConnectionConnection从中检索一个,然后将其丢弃PooledConnection。这意味着PooledConnection被抛弃,而到数据库的物理连接,不能重复使用,将被关闭/丢弃,当它终于垃圾收集(通常是当连接池要关闭物理连接,它会调用close()PooledConnection)。

您要么需要使用Application Server提供的连接池,要么使用诸如DBCP,c3p0或BoneCP之类的通用连接池。