Spring配置mysql連接池,連接超時解決方法

mysql默認連接超時時間爲8小時,Spring配置mysql連接池時,長時間不用連接句柄,會造成連接超時,主要是數據庫斷掉了連接,而程序本身不知道,繼續用着已經關閉的連接就會報錯,有三種作法可以解決這個問題,一種是改變mysql的my.ini文件,在my.ini裏添加wait_timeout=N秒;另外一種作法就是每次用到連接時都檢查一下是否超時,不過,這個作法相法不高明;還有一種作法就是利用org.apache.commons.dbcp.BasicDataSource裏本身的配置:testWhileIdle,GenericObjectPool中針對pool管理,起了一個Evict的TimerTask定時線程進行控制(可通過設置參數timeBetweenEvictionRunsMillis>0),定時對線程池中的鏈接進行validateObject校驗,對無效的鏈接進行關閉後,會調用ensureMinIdle,適當建立鏈接保證最小的minIdle連接數;validateQuery,代表檢查的sql;numTestsPerEvictionRun,代表每次檢查鏈接的數量,建議設置和maxActive一樣大,這樣每次可以有效檢查所有的鏈接,一般的配置如下:

<property name="testWhileIdle"><value>true</value></property>
<property name="testOnBorrow"><value>false</value></property>  
<property name="testOnReturn"><value>false</value></property>  
<property name="validationQuery"><value>select 1</value></property>
<property name="timeBetweenEvictionRunsMillis"><value>N毫秒(不能比數據庫默認的超時時間大)</value></property>  
<property name="numTestsPerEvictionRun"><value>建議設置和maxActive一樣大</value></property>  ,

其中testOnBorrow就是第二種作法就是在進行borrowObject進行處理時,對拿到的connection進行validateObject校驗;一般不啓用,浪費性能;

testOnReturn在進行returnObject對返回的connection進行validateObject校驗,和testOnBorrow配對使用。

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