原理:mysql每次建立一个socket连接(connect)时,这个socket都会占用一定内存。即使你关闭(close)连接时,并不是真正的关闭,而是处于睡眠(sleep)状态。当你下次再进行连接时,就可以快速启动当前处于睡眠状态的socket。
但由于使用了负载均衡器,jdbc处理超时,导致重新建立的连接并不一定会继续发往同一个后端mysql服务器。这样就无法自动kill 超时query。
像这种情况,解决方法有两个:一是直接在F5上做设置,当其第一次连接确定后,以后这个IP的连接只转发到第一次连接的后端服务器上(最好的方法,但会影响负载均衡效果);二是在mysql端做处理,比如设置如下参数:
在mysql的配置文件中修改my.cnf
添加如下的设置:
[mysqld]
wait_timeout = 100
interactive_timeout = 100
然后重启mysql服务,更改就会生效。
注:这个参数的含义:
wait_timeout:mysql服务器关闭非交互式连接之前等待活动的秒数
interactive_timeout:mysql服务器关闭交互式连接之前等待活动的秒数
以上参数需要进行实际业务测试,否则可能产生其它新问题。