2012-09-26 76 views
1

我有一個Runnable後者從下面的連接池的連接,並有60秒做一些與連接:如何強制重新使用jdbc池中的連接?

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

您實際上並未使用連接池。 A ConnectionPoolDataSource不打算直接使用。它旨在作爲(特殊的)DataSource對象PooledConnection然後通過提供連接池的(正常)DataSource實現保存在連接池中。

一個正常的顯影劑不應該使用一個ConnectionPoolDataSource直接,它旨在與由應用服務器提供的連接池的使用,或者被包裹成提供連接池通用DataSource秒。

Connection從連接池的要求,這將籤現有PooledConnection(或要求其ConnectionPoolDataSource一個新的),檢索Connection並返回給用戶。當用戶關閉Connection時,PooledConnection將通知連接池它再次可用。

在這種情況下,您正在創建一個PooledConnection,從中檢索Connection,然後丟棄PooledConnection。這意味着PooledConnection被拋棄,而到數據庫的物理連接,不能重複使用,將被關閉/放棄當它終於垃圾收集(通常是當連接池要關閉物理連接,它會調用close()PooledConnection )。

您可能需要使用連接池由應用程序服務器提供的,或者使用通用連接池DBCP一樣,C3P0或BoneCP。

+0

感謝您的回覆。是的,這根本不使用連接池。看到[這](http://stackoverflow.com/questions/2353569/am-i-using-java-pooledconnections-correctly)以及清除了一些事情。 – Sridhar

1

你不說你使用一個連接池是什麼,所以答案是「或許」。

但是,大多數池都有一些方法來檢測放棄的連接。例如,DBCP爲您提供removeAbandonedremoveAbandonedTimeout配置參數。這些將不會立即將連接返回到池,所以您仍然會看到連接數增長,直到超時過期(並且希望,因爲您處於緊密的循環中,您已經設置了最大數量的連接開放連接)。

+0

謝謝。使用MysqlConnectionPoolDataSource - 我會檢查api。 – Sridhar