正確使用MySQL JDBC setFetchSize()方法解決JDBC處理大結果集 java.lang.OutOfMemoryError: Java heap space
阿新 • • 發佈:2017-11-14
() lai 設置 從服務器 rest direction tools start 記錄
view plain copy
昨天在項目中需要對日誌的查詢結果進行導出功能。
日誌導出功能的實現是這樣的,輸入查詢條件,然後對查詢結果進行導出。由於日誌數據量比較大。多的時候,有上億條記錄。
之前的解決方案都是多次查詢,然後使用limit 限制每次查詢的條數。然後導出。這樣的結果是效率比較低效。
那麽能不能一次查詢就把所有結果倒出來了?於是我就使用一次查詢,不使用limit分頁。結果出現 java.lang.OutOfMemoryError: Java heap space問題。
看來是DB服務器端將一次將查詢到的結果集全部發送到Java端保存在內存中。由於結果集比較大,所以出現OOM問題。
首先我想到的是遊標功能。那麽是不是可以使用遊標,一次從服務器端慢慢的取呢?上網查詢了一下,大家都說MySQL不支持遊標功能等等。
後來就去看JDBC代碼。找到了setFetchSize()方法,結果設置以後,卻不能生效,還是出現OOM問題。
我的設置如下
[java] view plain copy
- ps=conn.con.prepareStatement("select * from bigTable");
- ps.setFetchSize(1000);
後來在MySQL看到了這樣的方法:
[java]
- ps = (PreparedStatement) con.prepareStatement("select * from bigTable",
- ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
- ps.setFetchSize(Integer.MIN_VALUE);
- ps.setFetchDirection(ResultSet.FETCH_REVERSE);
正確使用MySQL JDBC setFetchSize()方法解決JDBC處理大結果集 java.lang.OutOfMemoryError: Java heap space