2018.3.22,今天一早来到公司,就被告知有个问题需要处理,大概有1千多个错误邮件。然后自己开始在百度、谷歌上一通搜,原来是Mysql的8小时问题导致的,其实项目中已经解决了这个问题,只是用的是Spingboot项目,配置参数没有生效而已,Springboot默认使用的是内置tomcat的数据库连接池,所以将原有的参数配置spring.datasource.xxx=xxx改成spring.datasource.tomcat.xxx=xxx,参数生效,问题圆满解决了。但是这里有必要总结一下经典的Mysql的8小时问题。
程序报错
Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 1,767 milliseconds ago. The last packet sent successfully to the server was 1,767 milliseconds ago.
问题复现:
修改wait_timeout和interactive_timeout的值为20即可复现,定期查询数据库数据,即可复现。
问题描述:
MySQL的默认情况下,当一个连接的空闲时间超过8小时后,MySql会断开该连接,而tomcat内置/c3p0/dbcp连接池则以为该连接依然有效,这种情况下,如何客户端代码向连接池获取连接,连接池就会把失效的连接返回给客户端代码,客户端代码在使用该失效的连接后就会抛出上面的异常。