背景:
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