600300290dbaa2979.jpg_fo742.jpg
6VJkse.gif
报错为:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 4,251,972 milliseconds ago. The last packet sent successfully to the server was 4,251,972 milliseconds ago. is longer than the server configured value of ‘wait_timeout’.
区别:
长连接:系统通讯连接建立后就一直保持,即应用端发送sql到数据库服务器端, 服务器端返回结果给客户端后,该连接一直保持。
短连接:只有系统需要相互发消息连接才建立(客户端发起),请求消息得到响应 后连接关闭,即应用端发送sql到数据库服务端,服务端返回结果给客户端后,该连接 立即关闭,一个sql请求,即打开关闭一次数据库连接,影响数据库性能,不适合高并发环境。

异常原因:
目前我们系统使用的是C3P0连接池技术,即长连接。每次应用(tomcat)开启, 用户点击系统功能,发送sql执行请求给数据库,数据库执行完成后,如果没有新的sql执行请求,则该连接在数据库中的状态为sleep(select state from information_schema.processlist),即空闲状态。该空闲状态的连接在数据库配置的wait_timeout参数到期后,将被关闭。我们乐观的假设在wait_timeout到期之后,该数据库连接依然不会被sql请求占用,则该连接(连接ID:888)会被数据库的进程管理机制 直接kill掉。该连接物理断开。该连接物理断开之后,C3P0却认为连接ID为888的连接依然存在,此时新的请求sql依然给连接ID为888的连接上发送sql请求。悲剧由此发生。

1,c3p0连接失效的时间(maxidletime)小于数据库的连接失效时间 (wait_timeout);
2,每隔一段时间 idleConnectionTestPeriod,检测C3P0的连接是否失效, 如果失效,则sql请求不往该长连接发送请求。

确定MySQL数据库的最大wait_timeout:
登录root用户进入数据库,执行下面语句:
show variables like ‘%wait_timeout%’;
找到应用的c3p0-config.properties文件,修改如下参数:
maxIdleTime=400(建议小于600S,必须小于wait_timeout);
找到应用的c3p0-config.properties文件,增加如下参数:
idleConnectionTestPeriod=300(该参数值必须小于maxIdleTime)

修改完成后,重新启动tomcat。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code