代码之家  ›  专栏  ›  技术社区  ›  Pyrolistical

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

  •  31
  • Pyrolistical  · 技术社区  · 16 年前

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

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

    2 回复  |  直到 16 年前
        1
  •  31
  •   Eric Petroelje    16 年前

    我也有同样的问题,这绝对让人发疯。以下是文档在MySQL网站上所说的(强调我的)

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

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

    最后我编写了一个小框架,它捕获异常,检查特定的错误,并尝试重新连接,如果可能的话重试查询。

    埃塔 : This link 提供更多信息,并指示将来无论如何可能会删除自动连接。

        2
  •  2
  •   chaos    16 年前

    AutoConnect仍然会抛出异常,因此如果您愿意,可以选择对这种情况做些什么。如果你抓住了它,你应该会发现连接在那里。(如果您在一个事务中,则会有一些更复杂的情况——您当前的事务几乎是死的。)