mysql Communications link failure druid
最近項(xiàng)目測(cè)試環(huán)境從公有云切換到私有云環(huán)境,代碼未做改變,但是服務(wù)端訪問(wèn)數(shù)據(jù)庫(kù)老是失敗,查看日志發(fā)現(xiàn)以下信息:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure?
從信息可以看出是因?yàn)閖dbc與mysql之間的連接斷了導(dǎo)致的。筆者所在項(xiàng)目組使用的是阿里巴巴的druid連接池,版本為1.1.0,下方是項(xiàng)目出錯(cuò)時(shí)的druid配置:
spring:datasource:url: ${url}username: ${username}password: ${pwd}type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Drivervalidation-query: SELECT 1;#數(shù)據(jù)庫(kù)連接存活性檢查語(yǔ)句time-between-eviction-runs-millis: 3600000配置類: @Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSource druidDataSource() {return new DruidDataSource();}由于筆者有自己開發(fā)過(guò)數(shù)據(jù)庫(kù)連接池,因此首先想到的就是查看druid連接池核心源碼,以下三圖是druid數(shù)據(jù)庫(kù)連接有效性檢查的關(guān)鍵代碼:
?
?
? ? ? ?其中testOnborrow與testOnreturn默認(rèn)值都是false,如果設(shè)置為true,那么每次從連接池獲取數(shù)據(jù)庫(kù)連接和歸還數(shù)據(jù)庫(kù)連接都要發(fā)sql去數(shù)據(jù)庫(kù)檢查有效性,對(duì)性能不太友好,不建議設(shè)置為true。因此我們的目標(biāo)只能放到testWhileIdle這個(gè)參數(shù)上了。
? ? ? ?上圖源碼顯示testWhileIdle默認(rèn)設(shè)置為true,如果數(shù)據(jù)庫(kù)連接空閑時(shí)間大于timeBetweenEvictionRunsMillis,會(huì)執(zhí)行有效性檢查sql檢測(cè)連接是否有效。這樣就避免了每次從連接池獲取數(shù)據(jù)庫(kù)連接都去檢查有效性,我們只要確保mysql的連接空閑等待時(shí)間大于timeBetweenEvictionRunsMillis即可。
? ? ? 下面查看下mysql的連接空閑等待時(shí)間,可以看出是1800秒,而項(xiàng)目設(shè)置的timeBetweenEvictionRunsMillis是3600_000毫秒,mysql的連接空閑等待時(shí)間只有druid的一半,看到這里基本也就知道該怎么做了。
協(xié)商后將mysql wait_timeout修改為28800秒,再修改druid配置為如下(其中timeBetweenEvictionRunsMillis設(shè)置為21600_000毫秒)后,順利解決了Communications link failure的問(wèn)題。
spring:datasource:url: ${url}username: ${username}password: ${pwd}type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Drivertest-while-idle: truetime-between-eviction-runs-millis: 21600000keep-alive: truemin-evictable-idle-time-millis: 21600000validation-query: SELECT 1;druid官方配置說(shuō)明:https://github.com/alibaba/druid/blob/master/druid-spring-boot-starter/src/test/resources/config-template.properties
總結(jié)
以上是生活随笔為你收集整理的mysql Communications link failure druid的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解析性语言与编译性语言优劣对比
- 下一篇: mysql批量更新,批量插入之repla