最近应用在启动一段时间一后,就会偶发Communications link failure错误,偶尔也会报connect refused。
在网上找了一圈,找到比较靠谱的说法:mysql的server端,有自动断连机制,如果一个连接超过time_out的值,就会断开。
而我的应用,使用的是druid线程池,mysql断开时并没有通知线程池连接已断,此时如果用户要查询数据,而正好拿到线程池中已经被mysql单方面断开的连接,就会报上面的错误。
网上已有的解决方案:
1、修改timeout值,治标不治本
2、配置自动连接:autoConnect,可以解决,但限mysql4
还有几种方案,都不可行。我的最终方案:
druid有连接保活机制,我的应用也已经配置了相关参数,但经过排查发现都没有作用,此问题的解决思路如下:
1、保证连接有效
2、保证线程池已经开启了保活机制
3、查看mysql执行日志验证保活是否生效(关键)
4、springboot 相关参数为:
keepAlive:true
testWhileIdle:true
validationQuery: SELECT 1
timeBetweenEvictionRunsMillis: 6000
5、查看druid源码,如果保活机制默认为ping,修改为select 1.在启动时,jar包方式:
-Ddruid.mysql.usePingMethod=false
单元测试以及ide启动也可能配置此参数。
6、最后,查看linux日志,我们的mysql服务内存过高被kill了…………
以上。