为什么autoReconnect=true似乎无法正常工作?

36
我正在使用JDBC连接到MySQL服务器(我想没有连接池)。在连接URL中,我有autoReconnect=true。但是我的连接仍然超时。我甚至检查了conn.isClosed(),它的返回值为false。但是当我尝试使用连接时,我会得到以下异常:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException MESSAGE: Software caused connection abort: socket write error STACKTRACE:
java.net.SocketException: Software caused connection abort: socket write error …
我知道在Java 1.6中,您可以使用conn.isValid(0)来检查连接,但我正在使用Java 1.5。是否有一种方法可以确保它不会超时?还是我必须升级到Java 1.6?
2个回答

37

我曾经遇到同样的问题,那真是太令人发疯了。这是MySQL网站上文档所说(重点在于我):

驱动程序是否应该尝试重新建立过期或断开的连接?如果启用,驱动程序将对当前事务属于的已过期或已断开连接的查询抛出异常,但会在下一个新的事务中发出查询前尝试重新连接。不建议使用此功能,因为当应用程序不能正确处理SQLExceptions时,它具有与会话状态和数据一致性相关的副作用,并且仅设计用于在无法配置应用程序以正确处理死连接和陈旧连接导致的SQLExceptions时使用。或者,尝试将MySQL服务器变量“wait_timeout”设置为某个高值,而不是默认值8小时。

根据我的经验,“在下一次查询时重新连接”的功能似乎也没起作用,但我使用的是MySQL 4.0,这可能是原因。

最终,我编写了一个小型框架来捕获异常、检查特定错误并在可能的情况下尝试重新连接和重试查询。

预计完成时间: 此链接 提供了更多信息,并表明autoReconnect可能会在未来被删除。


4
有关不使用autoReconnect的建议已经8-10年了,因为它将来会被删除。然而,我仍然看到MySQL 5.x提供指导,建议设置Connector/J的autoReconnect属性是解决此问题的选项... - Vito Andolini
2
从链接的文档中:「没有一种百分之百安全的方式可以让JDBC驱动程序在TCP/IP连接断开时自动重新连接,而不会冒着破坏数据库“状态”的风险(即使使用事务语义),这就是为什么这个功能最终将被删除的原因。」 - pm_labs

3

autoReconnect仍然会抛出异常,因此您可以选择对该情况采取措施。如果您捕获了它,您应该发现连接在之后又恢复了。(如果您正在进行事务,则有一些更复杂的情况——您当前的事务基本上已经失效。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接