com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link

背景:

     springboot項目配置的druid連接池。今天啓動項目時突然報com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link,拒絕連接。然後前端的反映就是請求一直pending。

排查原因:

       mysql用的5.6,默認的wait_time是8小時,8小時後連接自動斷開,但是druid連接池中的連接卻不知道,所以會再次通過失效的連接,操作數據庫,所以會出現拒絕連接的情況。

解決辦法有三個:

(一)適用於mysql4及以下版本

         在jdbc連接url的配置中,附上“autoReconnect=true”參數,即可解決

(二)修改數據庫配置文件

       修改MySQL的參數,linux中mysql的wait_timeout最大爲31536000即1年,在my.cnf中加入:

       [mysqld]

      wait_timeout=31536000

      interactive_timeout=31536000

      重啓生效,需要同時修改這兩個參數

(三)配置連接池

      思路:在使用連接之前,校驗連接是否有效。

               並保證連接的時間小於wait_time.

              另外定時檢查連接是否有效

druid的參數說明如下:https://blog.csdn.net/zhangjinwei417/article/details/92823438

配置如下:

datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    druid:
      url: jdbc:mysql://127.0.0.1:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
      username: yourname
      password: yourpassword
//    初始連接數
      initial-size: 10
//    最大連接數
      max-active: 100
//    最小連接數
      min-idle: 10
//    指定連接池等待連接返回的最大等待時間,毫秒單位.
      max-wait: 60000
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
//    空閒連接回收的時間間隔,與test-while-idle一起使用,設置1分鐘
      time-between-eviction-runs-millis: 60000
//    連接池空閒連接的有效時間 ,設置5分鐘
      min-evictable-idle-time-millis: 300000
//    這個一定要配置  配置測試查詢語句 orcle:select 1 from dual   sqlserver  mysql SELECT 1
      validation-query: SELECT 1 FROM DUAL
//    檢測是否有效 驗證連接的有效性
      test-while-idle: true
//    獲取連接時候驗證,會影響性能(但是也建議設置爲true)
      test-on-borrow: false
//    在連接歸還到連接池時是否測試該連接
      test-on-return: false

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章