C3P0連接池的斷開自動重聯功能

問題背景

Java後臺日誌發現Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure的錯誤,查了下,發現是mysql連接超時斷開,而連接池還以爲鏈接正常時報的錯誤;

解決方案

1、延長空閒超時時間

set global wait_timeout=604800;

set global interactive_timeout=604800;

這兩個參數分別都設置爲604800秒即7天;

2、添加連接池對數據庫連接的狀態檢測動作(有降低一定性能)

<bean id=”dataSource” class=”com.mchange.v2.c3p0.ComboPooledDataSource”   destroy-method=”close”>
         <property name=”driverClass” value=”${dataSourceforSe.driverClassName}” />
         <property name=”jdbcUrl” value=”${dataSourceforSe.url}”/>            
         <property name=”user” value=”${dataSourceforSe.username}”/>
         <property name=”password” value=”${dataSourceforSe.password}”/>
         <property name=”minPoolSize” value=”2″/>
         <property name=”maxPoolSize” value=”20″/>
         <property name=”maxIdleTime” value=”1800″/>
         <property name=”acquireIncrement” value=”2″/>
         <property name=”maxStatements” value=”0″/>
         <property name=”initialPoolSize” value=”3″/>
         <property name=”idleConnectionTestPeriod” value=”240″/>
         <property name=”acquireRetryAttempts” value=”10″/>
         <property name=”breakAfterAcquireFailure” value=”false”/>    <!– 網絡故障恢復之後,pool能繼續請求設爲false –>
         <property name=”testConnectionOnCheckout” value=”true”/> 
    </bean>

在原有配置上添加三個選項

<property name="breakAfterAcquireFailure" value="false"/>
<property name="idleConnectionTestPeriod" value="180"/>
<property name="acquireRetryAttempts" value="10"/>

 breakAfterAcquireFailure: false 
        true表示pool向數據庫請求連接失敗後標記整個pool爲block並close,就算後端數據庫恢復正常也不進行重連,客戶端對pool的請求都拒絕掉。false表示不會標記   pool爲block,新的請求都會嘗試去數據庫請求connection。默認爲false。因此,如果想讓數據庫和網絡故障恢復之後,pool能繼續請求正常資源必須把此項配置設爲false   

 idleConnectionTestPeriod: 60 
       C3P0會有一個Task檢測pool內的連接是否正常,此參數就是Task運行的頻率。默認值爲0,表示不進行檢測。 

 acquireRetryAttempts: 10
       重試次數 

查看原文

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