我使用JDBC连接到MySQL服务器(我认为没有连接池)。在连接网址中,我有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中你可以使用conn.isValid(0)
来检查连接,但我使用的是Java 1.5
有没有办法确保它没有超时?或者我将不得不升级到Java 1.6?
答案 0 :(得分:32)
我有同样的问题,这绝对令人抓狂。以下是文档在MySQL网站上的说法(强调我的)
驱动程序是否应该尝试重新建立过时和/或死连接? 如果启用,驱动程序将为在陈旧或死连接上发出的查询抛出异常,这些查询属于当前事务,但会在新事务中的连接上发出下一个查询之前尝试重新连接。建议不要使用此功能,因为当应用程序无法正确处理SQLExceptions时,它会产生与会话状态和数据一致性相关的副作用,并且仅在您无法配置应用程序以处理因死亡而导致的SQLExceptions时使用和陈旧的连接正确。或者,研究将MySQL服务器变量“wait_timeout”设置为某个高值,而不是默认值为8小时。
根据我的经验,似乎“重新连接下一个查询”功能也不起作用,但我使用的是MySQL 4.0,这可能就是原因。
我最终编写了一个捕获异常的迷你框架,检查该特定错误,并尝试重新连接并在可能的情况下重试查询。
ETA :This link提供了更多信息,并表示将来可能会删除autoReconnect。
答案 1 :(得分:2)
autoReconnect仍然会抛出异常,因此如果您愿意,可以选择对此情况执行某些操作。如果你抓住它,你应该发现之后再次连接。 (如果你在交易中有一些更复杂的事情 - 你当前的交易已经非常死了。)