相信很多同學(xué)遇到過數(shù)據(jù)庫連接池超時的異常
Communications link failure
The last packet successfully received from the server was 1,008 milliseconds ago.? The last packet sent successfully to the server was 1,002 milliseconds ago.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 1,008 milliseconds ago.? The last packet sent successfully to the server was 1,002 milliseconds ago.
異常的原因很簡單,本地連接池維持的連接超過數(shù)據(jù)庫的超時時間棵逊,例如數(shù)據(jù)庫配置900秒超時旋廷,druid 默認(rèn)空閑連接超時時間7個小時
這里涉及到幾個核心參數(shù)
#連接數(shù)配置 空閑最小 空閑最大 最多連接數(shù) 初始化連接數(shù)?
druid.minIdle=4
druid.maxIdle=8
druid.maxActive=40
druid.initialSize=10
#配置獲取連接等待超時的時間
druid.maxWait=900
#檢測sql? 用連接淡诗,還連接廊鸥,空閑時三個檢測
druid.validationQuery="select 1"
druid.testOnBorrow=true
druid.testOnReturn=false
druid.testWhileIdle=true
#配置一個連接在池中最小生存的時間禁荸,單位是毫秒
druid.minEvictableIdleTimeMillis=30000
druid.maxEvictableIdleTimeMillis=600000
#配置間隔多久才進行一次檢測乘粒,檢測需要關(guān)閉的空閑連接膨更,單位是毫秒
druid.timeBetweenEvictionRunsMillis=6000
一般來講需要調(diào)整這幾個參數(shù)來包裝連接有效性。
建議使用連接和空閑時檢測打開即可蝠嘉,歸還時檢測沒必要最疆。
最大空閑時長肯定大于最小空閑時常,這里有個建議 最大空閑+間隔檢測時常<數(shù)據(jù)庫超時蚤告。
關(guān)于具體銷毀創(chuàng)建連接介紹可以看下這個
http://www.reibang.com/p/e7a1300f4250
我這邊也遇到這個問題努酸,看了下druid監(jiān)控頁面最大maxEvictableIdleTimeMillis用的默認(rèn)7小時,肯定是不合理的杜恰。
但是公司把druid做了一層包裝获诈,但是參數(shù)又沒能透傳到druid,修改包裝源碼又不好弄心褐。所以另辟蹊徑
啟動參數(shù)加上舔涎。再去druid監(jiān)控看了下成功改掉。
-Ddruid.maxEvictableIdleTimeMillis=800000 -Ddruid.minEvictableIdleTimeMillis=60000
另:
可以通過控制keeplive 但是要求版本
https://github.com/alibaba/druid/wiki/KeepAlive_cn
github打開慢的可以直接看下面
在Druid-1.0.27之前的版本逗爹,DruidDataSource建議使用TestWhileIdle來保證連接的有效性亡嫌,但仍有很多場景需要對連接進行保活處理掘而。在1.0.28版本之后挟冠,新加入keepAlive配置,缺省關(guān)閉袍睡。使用keepAlive功能知染,建議使用最新版本,比如1.1.21或者更高版本
初始化連接池時會填充到minIdle數(shù)量斑胜。
連接池中的minIdle數(shù)量以內(nèi)的連接持舆,空閑時間超過minEvictableIdleTimeMillis色瘩,則會執(zhí)行keepAlive操作。
當(dāng)網(wǎng)絡(luò)斷開等原因產(chǎn)生的由ExceptionSorter檢測出來的死連接被清除后逸寓,自動補充連接到minIdle數(shù)量。
-Ddruid.keepAlive=true
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
? ? <property name="keepAlive" value="true" />
</bean>
通過Spring配置connectionProperties
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
? ? <property name="connectionProperties" value="keepAlive=true" />
</bean>