com.mysql.jdbc.exceptions.jdbc4.CommunicationsException间隔一段时间后操作系统报错-连接超时

 Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 60,614,379 milliseconds ago.  The last packet sent successfully to the server was 60,614,379 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

最近新上线一个项目,mysql5.6.7数据库,我们提供接口服务,对方业务系统每天定期往我们系统中批量传数据,然后每天传输数据的前两条总会出错,错误信息如上所述。百度了一圈原来是与mysql数据库的配置有关,mysql将其连接的等待时间(wait_timeout)缺省为8小时,下图为在正式环境查到的mysql的wait_timeout配置信息:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException间隔一段时间后操作系统报错-连接超时

28800 seconds,也就是8小时

超过wait_timeout后mysql将关闭改连接,但是此时Java应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到上述错误。

解决办法:

1,在jdbc连接url的配置中,你可以附上“autoReconnect=true”,但这仅对mysql5以前的版本起作用。

2,增加wait_timeout和interactive_timeout的缺省值,set global wait_timeout=604800;set global interactive_timeout=604800;

但是这样一直长时间占用数据库连接,可能会影响数据库及服务器性能,甚至会导致内存溢出(未求证!)。

仅此记录一下,如有错误之处欢迎指正。

参考:https://blog.****.net/cynhafa/article/details/19676865?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param