【问题标题】:JDBC lost connection while iterating ResultSet迭代 ResultSet 时 JDBC 丢失连接
【发布时间】:2013-02-19 14:16:28
【问题描述】:

在我的应用程序中,我使用 Spring 和 JdbcDAOSupport 通过 TCP/IP 连接到 MSSQL 数据库。当连接稳定时它工作正常,但是当我在遍历结果集时拔下以太网电缆时,应用程序会挂起。它不会抛出任何异常。

JdbcTemplate jdbc = getJdbcTemplate();
return jdbc.query(sql, mapper, someArgs);

其中 mapper 是我自己的 RowMapper 类。我尝试使用 Connection 和 PreparedStatement 并没有解决问题。有没有人对此有任何解决方案或有类似的问题?

【问题讨论】:

    标签: spring jdbc resultset jdbctemplate


    【解决方案1】:

    应用程序挂起,因为 TCP/IP 的设计考虑了不良连接。当一个数据包没有到达它的目的地时,发送者简单地用指数回退重试。如果此行为不可取,则配置套接字阻塞超时 (SO_TIMEOUT)。

    很遗憾,SQL Server JDBC 驱动程序没有配置套接字超时的选项,因此它会无限期阻塞。

    正如 Nathan Hughes 在他的评论中指出的那样,jTDS driver 确实有一个配置 socketTimeout 的选项,因此您可以尝试使用该驱动程序。

    【讨论】:

    • 也许试试jtds?看起来它有一个套接字超时 (jtds.sourceforge.net/faq.html)
    • @NathanHughes 这可能是唯一的选择,是的
    • @Falcon:我认为不是 loginTimeout。你有没有看到这个条目(在常见问题页面的下方):socketTimeout(默认 - 0)在超时之前等待服务器响应的时间(以秒为单位)。
    • 这个解释确实有助于诊断一个棘手的问题,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2011-01-07
    • 2019-02-15
    • 2010-12-26
    相关资源
    最近更新 更多