問題背景
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 重試次數