2007-05-10

Tags: connection-pool , 程式語言

話說...我負責的某謎樣鳥蛋系統這週上線了。

因為這個謎樣系統當初後端連DB的部份有用到Hibernate,所以理所當然的就是用官方建議的c3p0 Connection Pool來管理DB連線的問題。不過...我發現我被c3p0給擺道了,因為系統golive時這部份參數設置不當,結果導致DB Connection暴衝,一下子就給你從10、20給你一路衝到70以上;然後...再隔一陣子,DB就隔屁了...囧rz

後來查了一下原因,猜想除了參數設置不當之外,有很大一部份是某一段時間內的使用者量太高所導致;當c3p0要把連線從DB中release時,User又進系統了,結果就是連線給你一路追加。

下面這個是我後來調整過的參數值,調好後DB Connection的問題就再也沒發生了。

1. Hibernate設定檔的設置方式
c3p0.min_size 設為 10
c3p0.max_size 設為 35
c3p0.acquire_increment(指達到max_size的用量後一次可以再追加多少的連線數) 設為 0
c3p0.max_statements 設為 0 (這個一定要設成0,不然Connection Pool會常出現DeadLock的Error,在Hibernate官方forum上查了一下,這問題"似乎"是c3p0本身的bug)
c3p0.timeout(單位為秒) 設為 300
c3p0.idle_test_period(單位為秒,指多久要去Check一次是否有connecion被閒置不用) 設為 100

2.如果只是單純的使用c3p0,不跟Hibernate綁在一起,參數設定則是下面這樣
minPoolSize 設為 10
maxPoolSize 設為 35
acquireIncrement 設為 0
maxStatements 設為 0
maxIdleTime 設為 300
idleConnectionTestPeriod 設為 100

我設置這些參數的Reference Document是來自這裡( 其一其二),有需要的人也可以去看看這些文件的說明...:)