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