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