【问题标题】:JDBC connection hangs at executing rs.next()执行 rs.next() 时 JDBC 连接挂起
【发布时间】:2012-05-23 21:48:41
【问题描述】:

我正在尝试从 mySQL 服务器(在我的 LAN 中)读取一个巨大的结果集。我以寻找setFetchSize 方法的方式实现它:BalusC's Example。所以我做了:

        con = DriverManager.getConnection(url, user, password);

        //con.setAutoCommit(false);
        st = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        st.setFetchSize(Integer.MIN_VALUE);
        rs = st.executeQuery(query);

        int count = 0;
        while (rs.next ()) {                
            // Process entry
            String rsc = rs.getString ("resource");
            String tpc = rs.getString("topic");   
            System.out.println(count + ": " + rsc); 
            ++count;                
        }

虽然,它挂在第 1077 行的 rs.next() 行。它不会抛出异常。

编辑:

超时后发生了一些新的事情。它返回了这个错误 留言:

JDWP exit error JVMTI_ERROR_NONE(0): getting frame location [../../../src/share/back/stepControl.c:641]

这个错误似乎无关。

EDIT2:我编写了一个 PHP 脚本,用于按流检索结果,并且发生的情况完全相同。所以跟JDBC没啥关系……不知道怎么回事!!

【问题讨论】:

  • Integer.MIN_VALUE 是负值。 setFetchSize() 中只定义了 0 和正值。您想通过这次通话实现什么目标?
  • 不,我发现这是为 JDBC mySQL 做的方法
  • 例如:stackoverflow.com/questions/2180835/… Btw,@BalusC 似乎是这方面的专家。
  • 哦,MySQL 人又一次破坏了标准。他们多么。恐怕我在这里帮不了你。
  • 有趣,所以负数表示“一次一行”。我想知道为什么没有选择 setFetchSize(1) 。还与 PAI 文档冲突,该文档说 setFetchSize 为值

标签: java mysql jdbc large-data-volumes


【解决方案1】:

第二条错误消息是 Eclipse 调试器在热交换和/或 JRebel (source) 时出现死锁:

这是一个已知问题,实际上是两个问题。
1) Eclipse 调试器有时会在热交换时死锁(对于任何版本的 JRebel 都是如此)。
2) 热交换时 JVM 崩溃 - JRebel 4M1 确实如此。

我们期待很快发布错误修复(3.6.2 连同 Eclipse 插件)-它将修复第一个问题。第二个问题应该在 4M2 版本中修复。

建议:

  1. 将 Eclipse 更新到 3.7.2,将 JRebel 更新到最新版本
  2. 再次启动应用程序。
  3. 使用logging/System.out.println()进行调试
  4. 检查 mysql 服务器的日志是否存在问题(硬盘、网络)
  5. 在 SQL 工作台中运行查询(以查看这是否是查询/服务器或您的代码中的问题)

【讨论】:

  • 感谢您的回复。在谷歌寻找解决方案时,我也发现了这些信息。 1.我不使用JRebel,使用Eclipse的最新版本。 2. 我已经这样做了,甚至在 mySQL 服务器所在的同一台机器上执行应用程序。 3. 我发现它挂在哪一行...还有什么信息可以提供? 4. 这是我唯一还没有做的事情。我会试着告诉你一些事情。 5. 完成。我尝试在 mySQL propmt 中执行查询,并正确检索了 1080 行。
  • 我检查了 /var/log/mysql.err 和 /var/log/mysql.log,它们是空的!
  • 它是挂在第一行还是可以读取一些然后挂起?你能检查它是否是GC问题吗?请参阅此处如何启用 GC 日志记录:christiansons.net/mike/blog/2008/12/…
  • 我终于找到了解决办法,我会在几分钟后发布。
【解决方案2】:

好的,问题出在查询本身。

我发现流式传输对查询的构建方式非常敏感。如果我做一点改变(比如添加 SELECT DISTINCT),它会缓冲或挂起。最后,我在查询中留下了一列并开始工作......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 2014-04-18
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多