最近碰到一个mysql数据库的问题就是一个标准的servlet/tomcat网络应用后台使用mysql数据库问题是待机一晚上后第二天早上第一次登录总是失败察看日志发现如下错误
commysqljdbcexceptionsjdbcCommunicationsException: Communications link failure
Last packet sent to the server was ms ago
经过一番调研发现很多人都碰到过类似问题但网上令人满意的回答并不多mysql网站上的提问也很多但并没有正确答案;百度知道上倒是有一个近似正确的回答现将本人的解决办法总结一下
上述问题是由mysql数据库的配置引起的mysql将其连接的等待时间(wait_timeout)缺省为小时在其客户程序中可以这样来查看其值
mysql>
mysql> show global variables like wait_timeout;
+++
| Variable_name | Value |
+++
| wait_timeout | |
+++
row in set ( sec)
seconds也就是小时
如果在wait_timeout秒期间内数据库连接(javasqlConnection)一直处于等待状态mysql就将该连接关闭这时你的Java应用的连接池仍然合法地持有该连接的引用当用该连接来进行数据库操作时就碰到上述错误这解释了为什么我的程序第二天不能登录的问题
你可能会想到在tomcat的数据源配置中有没有办法解决?的确在jdbc连接url的配置中你可以附上autoReconnect=true但这仅对mysql以前的版本起作用增加validation query似乎也无济于事
本人觉得最简单的办法就是对症下药既然问题是由mysql的全局变量wait_timeout的缺省值太小引起的我们将其改大就好了
查看mysql的手册发现对wait_timeout的最大值分别是天/天(windows/linux)以windows为例假设我们要将其设为天我们只要修改mysql的配置文件myini(mysql installation dir)增加一行wait_timeout=
需要重新启动mysql