为什么 autoReconnect=true 似乎不起作用?

2022-09-01 07:46:05

我正在使用JDBC连接到MySQL服务器(我认为没有连接池)。在连接 URL 中,我有autoReconnect=true

但我的连接仍然超时。我甚至检查过它是错误的。但是当我尝试使用连接时,我得到以下异常。conn.isClosed()

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中你可以用它来检查连接,但我使用的是Java 1.5conn.isValid(0)

有没有办法确保它不会超时?还是我必须升级到Java 1.6?


答案 1

我有同样的问题,这绝对是令人抓狂的。以下是文档在MySQL网站上所说的内容(强调我的)

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

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

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

ETA此链接提供了更多信息,并表明将来可能会删除autoReconnect。


答案 2

autoReconnect 仍会引发异常,因此,如果您愿意,可以选择对这种情况执行一些操作。如果您捕获它,您应该会发现连接之后再次存在。(如果你在交易中,那就更复杂了——你目前的交易几乎已经死了。


推荐