2012-01-02 78 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的組合。

我懷疑表中存在無效條目,找到它的方式是二分查找。