这个java MySQL异常的原因是什么(和治疗)?

时间:2010-03-22 00:45:45

标签: java mysql jdbc

在一段时间不活动后执行第一个预备语句时,我收到以下异常:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通讯链接失败

从服务器成功收到的最后一个数据包是2,855,054毫秒之前。成功发送到服务器的最后一个数据包是123毫秒前。     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)     在com.mysql.jdbc.Util.handleNewInstance(Util.java:406)     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)     在com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3052)     在com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2938)     在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3481)     在com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)     在com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)     在com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)     在com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)     在com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2228)

这只会在我的应用程序最近未与MySQL通信时显示。后续查询正常执行。我怀疑它是某种超时问题,但是不活动的时间段远低于MySQL的8小时超时。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您使用的是连接池吗?如果是这样,您可以打开连接池检查/监视,这样您就可以确保每次客户端线程都能获得有效的MySQL连接。大多数池都有一种方法可以指定在借用连接之前执行的低功耗SQL,或者有时甚至在空闲期间在后台执行(为了更好的性能,可能会发生一些错误的连接发送到客户端线程)。 p>

另外,w.r.t。时间< 8h问题,MySQL是否从最后一个数据包或最后一个重要事件(查询等)计算空闲?我记得在MySQL驱动程序代码中看到实现了心跳信号。

答案 1 :(得分:0)

  

我在一段时间不活动后执行第一个预备陈述时遇到以下异常

这只是我的猜测 - MySQL连接在一段时间不活动后被默认关闭,因为数据库连接是有价值的资产,所以它们应该通过代码很好地管理。

检查代码是否与数据库连接控制有关,您可以在那里找到答案。虽然通过MySQL超时设置超时值是8小时 - 它仍然可以在您的代码中(或在其他人的代码中?),连接将在一段时间不活动后关闭。