我有一个方法在清晨执行,但jdbc连接tomcat自行关闭,我不知道为什么以及如何。
The last packet successfully received from the server was 86.397.130 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3567)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3456)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3997)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2318)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
在我的 server.xml 中,我有资源"autoReconnect=true"
的上下文
URL =" JDBC:MySQL的://本地主机:3306 /数据库autoReconnect的=真"
但仍然无效。有任何帮助或建议吗?
感谢。
答案 0 :(得分:1)
这是因为您正在使用tomcat的mysql连接,该连接已被mysql服务器过期。如果您要创建单个连接并重新使用它,则会发生这种情况。在重新使用之前,您必须先验证连接。我建议使用连接池DBCP,C3P0等
即使使用带默认参数的标准连接池也不能解决问题。以DBCP为例,
您需要指定此参数validationQuery
。在池返回连接以供客户端使用之前,此validationQuery将针对服务器(mysql)运行,如果失败,则会丢弃连接并建立并返回新连接。
您可以使用SELECT 1
作为validationQuery
如果您不想使用连接池并且认为性能不是问题并且可以使用单个连接,则最简单的方法是每次创建新连接并关闭它。
修改1:
是的,你可以有一个可以完成工作的石英任务。这意味着您必须实现一个包装类,该类具有一个连接实例变量,该变量由后台Quartz任务每4小时刷新一次。请注意,时间段可在mysql服务器上配置。因此,您的刷新时间通常应小于此值。请注意,包含连接对象的包装器类可能会被某个时间点的两个不同线程(您需要连接和刷新线程的主线程)访问,您必须synchronize
。
答案 1 :(得分:-1)
MySQL在8小时后断开连接,请在这种情况下实现连接池(dbcp)。希望它能解决你的问题。