1

我正在尝试从 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无关......我不知道发生了什么!

4

2 回答 2

2

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

这是一个已知问题,实际上是两个问题。
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 工作台中运行查询(查看这是否是查询/服务器或您的代码中的问题)
于 2012-05-16T12:48:59.867 回答
1

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

我发现流对如何构建查询非常敏感。如果我进行一些更改(例如添加 SELECT DISTINCT),它会缓冲或挂起。最后,我在查询中留下了一列并开始工作......

于 2012-05-18T10:30:27.650 回答