數(shù)據(jù)庫連接斷開CommunicationsException: Communications

相信很多同學(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或者更高版本

打開KeepAlive之后的效果

初始化連接池時(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ù)量。

配置方法

通過JVM啟動(dòng)參數(shù)配置

-Ddruid.keepAlive=true

通過Spring配置

<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>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容