哈哈!這個問題在我們公司也發(fā)生過。經過幾天研究終于搞定。
c3p0的connection實現(xiàn)類和我們想象中有出入,最大的出入就是c3p0的connection實現(xiàn)類的close方法不是真的將該鏈接釋放掉,而是將這個鏈接回收到可用連接池中。于是問題就來了。
c3p0的有一個maxConnection的參數(shù),即最多鏈接數(shù)。還有一個genratNum,即當鏈接不夠用的時候自動每次生成鏈接的個數(shù)。假如將最大連接數(shù)設定為50,每次增長數(shù)設定為10,初始值為10。假如當前總共產生的鏈接數(shù)已經有49個,但是這49個鏈接不是可用連接數(shù),那么c3p0就會增長10個。這樣一共就產生了59個。
假如你設定最大空閑時間又過長,如一個月,那么就是被close的鏈接,也不會被釋放掉,一直保留鏈接池中。
所以很快c3p0就將數(shù)據(jù)庫的鏈接用完。
解決辦法是:
1. 在代碼中當創(chuàng)建了一個connection(或者從池中取),必須在要在合適的時機將該鏈接close掉。
2. 合理配置最大連接數(shù),最大空閑時間,每次增長數(shù)
3. 可以通過實行ConnectionCustomer接口,來顯式的對鏈接進行關閉,釋放資源的操作。
4. 第一點是最重要的,后兩點是輔助的。
轉自:http://www.oschina.net/question/242388_40477