2012-01-07 66 views
5

我有一個每天運行一次(大約1或2小時)的TimerTask。在每次運行時,它都會創建數百個線程爲MySQL數據庫中的每個表執行一些計算工作。我使用c3p0作爲數據庫源連接池(每個線程在計算之前獲得連接並在計算後關閉連接)。我設置了連接池的配置如下,c3p0如何關閉所有數據庫連接並在需要時重新打開它們?

cpDs = new ComboPooledDataSource(); 
cpDs.setMinPoolSize(10); 
cpDs.setMaxPoolSize(20); 
cpDs.setMaxStatementsPerConnection(10); 

在測試過程中,我發現所有的數據庫連接,在第二天的運行丟失了,和大量的「通信鏈路故障,由於底層異常」在日誌中均表現文件。所以我添加了以下配置以便在使用它之前測試連接。

// 7 hours, less than MYSQL default value - 8 hours 
cpDs.setMaxIdleTime(25200); 
cpDs.setTestConnectionOnCheckout(true); 
cpDs.setPreferredTestQuery("select 1"); 

,但我注意到,總有10個連接留睡眠/空閒狀態(通過SQL「SHOW PROCESSLIST;」)時一個TimerTask沒有運行,我經常看到著名的「視死鎖!!!」警告(該bug在c3p0項目http://sourceforge.net/tracker/?func=detail&aid=3432139&group_id=25357&atid=383690中仍處於打開狀態)。

那麼有沒有辦法在所有的計算工作完成時關閉所有連接,並在第二天重新執行任務時重新構建連接?謝謝。

問候, 喬伊

回答

3

如果您想所有的連接關閉,設置minPoolSizeinitialPoolSize爲0。另外,我建議減少maxIdleTime像600(10分鐘)的較小值。這些設置的組合可以使您的工作人員完成後,池快速「流失」。

您也可以使用ComboPooledDataSource中公開的reset方法之一強制所有連接關閉,但是如果池配置正確,則不需要。

+0

謝謝羅布,你的建議非常有幫助!我試過了,所有連接都在maxIdleTime過去後關閉。很好! – 2012-01-08 06:44:05

相關問題