JDBC连接在执行rs.next()时挂起

时间:2012-05-16 10:32:52

标签: java mysql jdbc large-data-volumes

我正试图从mySQL服务器(在我的局域网中)读取一个巨大的resultSet。我按照我发现寻找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;                
        }

虽然它挂在第{10}行第{10}行。它不会抛出异常。

编辑:

  

超时后发生了新的事情。它返回了这个错误   消息:

rs.next()

此错误似乎无关。

EDIT2:我编写了一个PHP脚本,用于按流检索结果,并且完全相同。所以它与JDBC无关......我不知道发生了什么!!

2 个答案:

答案 0 :(得分:1)

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

  

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

     

我们期待很快发布bugfix(3.6.2与Eclipse插件一起) - 它将解决第一个问题。第二个问题应该用4M2版本修复。

建议:

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

答案 1 :(得分:1)

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

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