Spring Boot连接MySQL长时间不连接后报错`com.mysql.cj.core.exceptions.ConnectionIsClosedException: No operations

Posted <・)))><<

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot连接MySQL长时间不连接后报错`com.mysql.cj.core.exceptions.ConnectionIsClosedException: No operations 相关的知识,希望对你有一定的参考价值。

报错:com.mysql.cj.core.exceptions.ConnectionIsClosedException: No operations allowed after connection closed.

添加 &autoReconnect=true 无济于事,此选项好像仅对 MySQL 5之前的版本有效。

原因

Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。

解决办法

http://www.cnblogs.com/hemingwang0902/archive/2012/03/15/2397620.html

临时解决办法

因为上面的办法需要修改数据库,但是我不想改数据库。所以:
修改一下连接MySQL的驱动(修改application.properties):

spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

改为

spring.datasource.driverClassName=com.mysql.jdbc.Driver

总结

使用jdbc原始的驱动应该是每一次查询都新建了一个连接;
而spring boot推荐的cj的这个驱动应该是先建立了一个连接(池),一直不断开,然后之后的查询都是从这个连接里面进行的,而MySQL在和这个连接连接了几个小时后就会断开这个连接。
虽然效率上来说cj这个连接池的方式更快。

以上是关于Spring Boot连接MySQL长时间不连接后报错`com.mysql.cj.core.exceptions.ConnectionIsClosedException: No operations 的主要内容,如果未能解决你的问题,请参考以下文章

在MySQL,Grails 2应用程序更长时间不活动期间保持池连接活动(或将它们计时并获得新的连接)的正确方法

Spring Boot:在长时间运行的存储过程中检测到明显的连接泄漏

保持ssh连接长时间不断开的技巧

linux设置长时间不操作自动断开连接

SSH连接Linux长时间不断开方案

MySQLdb 不活跃连接自动断开的解决方法