連接池超時解決辦法

最近折騰了jpa後,接下來就會發現一個大的問題,就是mysql在連接8個小時後,會自動的釋放連接。這個時候持久層用的連接池就會報錯了,頭疼的要死,後來找了一堆資料,看了下,只有一個辦法,設置數據庫連接的閒置時間,然後在連接池這一層做反閒置設置,意思就是在連接閒置以前先釋放掉這個連接。就不會出現問題了。

 

我用的連接池是c3p0

 

第一步是修改數據庫的閒置時間:

 

我這裏用的是mysql

那麼直接修改或者增加 MySQL 的 wait_timeout 屬性的值。
修改/etc/mysql/my.cnf文件,在 [mysqld] 節中設置:

# Set a connection to wait 8 hours in idle status.
wait_timeout = 86400

 

 

 

第二步設置c3p0

 

基本上就是這幾條

<!-- 當連接池用完時客戶端調用獲取連接方法後等待獲取新連接的時間,超時後將拋出SQLException,如設爲0則表示無限期等待,單位毫秒,默認0 <property name="Timeout" value="100"></property> --> <property name="checkoutTimeout" value="100" /> <!-- 初始化時創建的連接數,應在minPoolSize與maxPoolSize之間取值,默認爲3 --> <property name="initialPoolSize" value="3" /> <!-- 最大空閒時間,超過空閒時間的連接將被丟棄。爲0或負數則永不丟棄。默認爲0 --> <property name="maxIdleTime" value="25000" /> <!-- 接池中保留的最大連接數。默認爲15 --> <property name="maxPoolSize" value="15" /> <!-- JDBC的標準參數,用以控制數據源內加載的PreparedStatement數量。但由於預緩存的Statement屬 於單個Connection而不是整個連接池。所以設置這個參數需要考慮到多方面的因素,如果maxStatements與 maxStatementsPerConnection均爲0,則緩存被關閉。默認爲0 --> <property name="maxStatements" value="0" /> <!-- 連接池內單個連接所擁有的最大緩存Statement數。默認爲0 --> <property name="maxStatementsPerConnection" value="0" /> <!-- C3P0是異步操作的,緩慢的JDBC操作通過幫助進程完成。擴展這些操作可以有效的提升性能,通過多線程實現多個操作同時被執行。默認爲3 --> <property name="numHelperThreads" value="3" /> <!-- 用戶修改系統配置參數執行前最多等待的秒數。默認爲300 --> <property name="propertyCycle" value="600" /> <!--每60秒檢查所有連接池中的空閒連接。Default: 0 --> <property name="idleConnectionTestPeriod" value="18000" /> <!--如果設爲true那麼在取得連接的同時將校驗連接的有效性。Default: false --> <property name="testConnectionOnCheckin" value="true" /> <!--c3p0將建一張名爲Test的空表,並使用其自帶的查詢語句進行測試。 如果定義了這個參數那麼屬性preferredTestQuery將被忽略。 你不能在這張Test表上進行任何操作,它將只供c3p0測試使用。Default: null <property name="preferredTestQuery" value="SELECT 1" /> --> <property name="automaticTestTable" value="test" />

以上設置完成以後,就應該沒啥問題了,我現在還在測試中,明天就有結果了,到時候在更新blog

 

其他的連接池也應該有類似的問題,可以參照一下 :)

 

第二天訪問的時候果然沒有出現連接池的錯誤了,呵呵,不錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章