相信很多同學(xué)遇到過數(shù)據(jù)庫連接池超時(shí)的異常
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.

異常的原因很簡(jiǎn)單,本地連接池維持的連接超過數(shù)據(jù)庫的超時(shí)時(shí)間,例如數(shù)據(jù)庫配置900秒超時(shí),druid 默認(rèn)空閑連接超時(shí)時(shí)間7個(gè)小時(shí)
這里涉及到幾個(gè)核心參數(shù)
#連接數(shù)配置 空閑最小 空閑最大 最多連接數(shù) 初始化連接數(shù)?
druid.minIdle=4
druid.maxIdle=8
druid.maxActive=40
druid.initialSize=10
#配置獲取連接等待超時(shí)的時(shí)間
druid.maxWait=900
#檢測(cè)sql? 用連接,還連接,空閑時(shí)三個(gè)檢測(cè)
druid.validationQuery="select 1"
druid.testOnBorrow=true
druid.testOnReturn=false
druid.testWhileIdle=true
#配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒
druid.minEvictableIdleTimeMillis=30000
druid.maxEvictableIdleTimeMillis=600000
#配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒
druid.timeBetweenEvictionRunsMillis=6000
一般來講需要調(diào)整這幾個(gè)參數(shù)來包裝連接有效性。
建議使用連接和空閑時(shí)檢測(cè)打開即可,歸還時(shí)檢測(cè)沒必要。
最大空閑時(shí)長(zhǎng)肯定大于最小空閑時(shí)常,這里有個(gè)建議 最大空閑+間隔檢測(cè)時(shí)常<數(shù)據(jù)庫超時(shí)。
關(guān)于具體銷毀創(chuàng)建連接介紹可以看下這個(gè)
http://www.itdecent.cn/p/e7a1300f4250
我這邊也遇到這個(gè)問題,看了下druid監(jiān)控頁面最大maxEvictableIdleTimeMillis用的默認(rèn)7小時(shí),肯定是不合理的。
但是公司把druid做了一層包裝,但是參數(shù)又沒能透?jìng)鞯絛ruid,修改包裝源碼又不好弄。所以另辟蹊徑
啟動(dòng)參數(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來保證連接的有效性,但仍有很多場(chǎng)景需要對(duì)連接進(jìn)行?;钐幚?。在1.0.28版本之后,新加入keepAlive配置,缺省關(guān)閉。使用keepAlive功能,建議使用最新版本,比如1.1.21或者更高版本
初始化連接池時(shí)會(huì)填充到minIdle數(shù)量。
連接池中的minIdle數(shù)量以內(nèi)的連接,空閑時(shí)間超過minEvictableIdleTimeMillis,則會(huì)執(zhí)行keepAlive操作。
當(dāng)網(wǎng)絡(luò)斷開等原因產(chǎn)生的由ExceptionSorter檢測(cè)出來的死連接被清除后,自動(dòng)補(bǔ)充連接到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>