2012-01-02 83 views
0

我在Java中的mysql查询在某个位置总是停止(即冻结并且不会继续),即543,858;即使表中包含约。 200万条目。我通过记录当前的结果提取来检查这一点。 它是可重复的,每次发生在相同的位置。JDBC /结果集错误

"SELECT abc from bcd WHERE DATEDIFF(CURDATE(), timestamp) <= '"+days+"'"); 

增加:这绝对是一个 Java错误,我只是尝试了这种说法在Navicat(50岁运行时间)。

查询似乎在日志告诉我现在正在添加位置543,858的结果后冻结。

try { 
    ... 
    ResultSet res = new ResultSet(); 
    PreparedStatement stmt = new PreparedStatement(); // prepare statmenet etc. 
    stmt.setFetchSize(Integer.MIN_VALUE); 
    res = stmt.executeQuery(); 
    ... 
    System.out.println(res.getStatement()); 
    ... 
    while (res.next()) 
     treeSet.add(res.getString("userid")); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

编辑:我们能够找出问题所在。这种方法很好,返回的结果(500,000而不是2,000,000)也是正确的(在错误的数据库中查找以验证金额);问题是,使用上述结果的下一个方法调用需要从字面上永远,但没有实现日志记录。所以我一直被缺少控制台日志所迷惑。

谢谢反正!

+3

“停止”是什么意思? (请注意,您也应该使用参数化SQL,因为各种原因。)如果您可以显示您的代码,这将有所帮助。 – 2012-01-02 10:53:08

+0

如果没有先看到一些Java,这是非常不可能诊断的。 – dasblinkenlight 2012-01-02 10:54:36

+1

@ user1004816更好地在问题中粘贴您的代码 – soulcheck 2012-01-02 11:10:22

回答

1

我想你可能会在处理50万条记录后耗尽内存。尝试使用命令行选项-Xmx等分配更多内存。有关命令行选项的更多信息,请参阅here

+0

如果我的内存不足,Java可能会抛出异常;程序从2048到4096MB启动,否则它不会执行。 – 2012-01-02 11:29:40

1

在mysql中使用流式结果集,你必须指定更多的参数,而不仅仅是fetchSize。

尝试:

stmt = conn.createStatement('select ...', java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(Integer.MIN_VALUE); 

,看看是否可行。

这是在ResultSet部分中的documented

奇怪的是,它不会抛出异常,但这是我唯一的嫌疑犯。也许它开始垃圾收集/刷新内存到磁盘,它需要很多时间,它不会扔它。

+0

我已经试过这个,但它也不起作用。 stmt.setQueryTimeout(180);似乎并没有被执行,但他有一个突破,他也没有例外。 – 2012-01-02 11:41:23

+0

@ user1004816如果您只遍历结果集而没有向treeSet添加记录,会发生什么情况? – soulcheck 2012-01-02 11:45:16

0
  1. 我会尝试添加到您的查询“限制543857”,然后“限制543857”,看看会发生什么。
  2. 如果以上内容无效,请使用限制指令和order by的组合。

我怀疑表中存在无效条目,找到它的方式是二分查找。