【问题标题】:Why does autoReconnect=true not seem to work?为什么 autoReconnect=true 似乎不起作用?
【发布时间】:2010-10-14 14:46:22
【问题描述】:

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

但我的连接仍然超时。我什至检查了conn.isClosed() 及其错误。但是当我尝试使用连接时,出现以下异常。

com.mysql.jdbc.CommunicationsException:由于底层异常导致通信链接失败: ** 开始嵌套异常 ** java.net.SocketException 消息:软件导致连接中止:套接字写入错误 堆栈跟踪: java.net.SocketException:软件导致连接中止:套接字写入错误 ...

我知道在 Java 1.6 中你可以使用 conn.isValid(0) 来检查连接,但我使用的是 Java 1.5

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

【问题讨论】:

    标签: java jdbc timeout


    【解决方案1】:

    我遇到了同样的问题,这绝对令人抓狂。这是 MySQL 网站上的文档所说的(重点是我的)

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

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

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

    ETAThis link 提供了更多信息,并表明自动重新连接可能会在未来被移除。

    【讨论】:

    • 不使用 autoReconnect 的建议,因为它会在未来被删除是 8-10 岁。但我仍然看到 MySQL 5.x 提供了设置 Connector/J autoReconnect 属性是解决此问题的选项的指导...
    • 来自链接的文档:“没有 100% 安全的方式可以让 JDBC 驱动程序在 TCP/IP 连接中断时自动重新连接而不冒损坏数据库‘状态’的风险(甚至 with 事务语义),这就是为什么这个特性最终会被移除。”
    【解决方案2】:

    autoReconnect 仍然会引发异常,因此您可以根据需要选择对这种情况做些什么。如果你抓住它,你应该会发现连接再次在那里。 (如果你在一个事务中,会有更多的复杂性——你当前的事务几乎已经死了。)

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2019-03-14
      • 2022-11-13
      • 2012-10-19
      相关资源
      最近更新 更多