测试环境
CentOS 6.5
Mysql 5.7
问题描述
项目启动,第一次连接成功初始化连接池,连接无问题,无任何操作大概10几分钟的样子,连接池的连接全部失效,
报异常:
Connection is not available, request timed out after 30034ms.
No operations allowed after connection closed.
mysql 查看进程 SHOW PROCESSLIST 初始化的10个连接全部处于sleep状态(因为未到wait_time,所以没释放),
但是hikaricp 连接不上初始化时创建的那10个连接
在本地虚拟机安装mysql,局域网内测试,却不会出现此问题,猜测是否为路由器的某些原因直接断掉了?
下图为内网环境,60秒前的为初始化连接时收发的包,1692秒后的为无操作之后重新进行操作收发的包,内网无异常
相关配置
mysql 的 wait_timeout 默认值8小时
hikaricp 配置 maxLifetime: 5400000,其余保持默认(官方推荐配置是比 wait_timeout 少几秒钟,试过了,与此值在此问题上无差异),默认最大10个连接,最小与最大默认相同,即为固定连接数的连接池
另外,尝试过配置 maxLifetime: 540000,异常就不出现了,但是9分钟太短了,不配合更改wati_timeout的话,会导致mysql有非常多sleep的连接。
解决方法
配置/etc/sysctl.conf 如下:
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 300
然后执行 sysctl -p
net.ipv4.tcp_keepalive_time,这个值并非一成不变,一个内网环境通过端口映射的服务器,本地服务器最多设置为120秒,云服务器的则可以300