解決的思路是:MySQL配置中my.cnf的wait_timeout值必定要大於等於鏈接池種的idle_timeout值。不然mysql會在wait_timeout的時間後關閉鏈接,默認的關閉鏈接的時間爲8小時。
MySQL鏈接時,服務器默認的「wait_timeout」是8小時,也就是說一個connection空閒超過8個小時,Mysql將自動斷開該connection。connections若是空閒超過8小時,Mysql將其斷開,而DBCP並不知道該connection已經失效,若是這時有Client請求connection,DBCP將該失效的Connection提供給Client,將會形成異常。
那樣,在DBCP中咱們須要處理好如下問題:
一、對每一個鏈接進行檢查
二、對一次操做數據庫超過多少時間的鏈接進行移除
三、每隔多少時間檢測一次鏈接
四、一個鏈接在鏈接多少時間後,就必須刪除
具體的配置以下:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://192.168.40.10:3336/XXX" />
<property name="username" value="" />
<property name="password" value="" />
<property name="maxWait" value="20000"></property>
<property name="validationQuery" value="SELECT 1"></property>
<property name="testWhileIdle" value="true"></property>
<property name="testOnBorrow" value="true"></property>
<property name="timeBetweenEvictionRunsMillis" value="3600000"></property>
<property name="numTestsPerEvictionRun" value="50"></property>
<property name="minEvictableIdleTimeMillis" value="120000"></property>
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="6000000"/>
</bean>
DBCP參數說明見官網 PS:上面的配置中有一個問題就是每一個鏈接都會去執行SELECT 1效率如何??? 另:參考連接:http://www.2cto.com/database/201312/261593.html http://www.iflym.com/index.php/code/201308280001.html http://database.51cto.com/art/201107/276325.htm