2017-08-29 83 views
0

我正在使用hibernate 4.3.10,java 1.8和eclipse neon。 我一直在嘗試在我的代碼中執行以下語句。但java.lang.OutOfMemoryError:在選擇20萬行時在休眠時Java堆空間

java.lang.OutOfMemoryError: Java heap space

在幾分鐘後第二行拋出。

Query query = mySqlSession.createSQLQuery("select * from hops where processed is null"); 
List<Object[]> lis=query.list(); 

問題是此查詢返回約200k結果導致問題。我推薦 How to deal with "java.lang.OutOfMemoryError: Java heap space" error (64MB heap size)

從上面的鏈接閱讀解決方案後,我將內存更改爲2 GB。仍然存在問題。 有什麼建議嗎?

+2

是否有可能不將200k記錄存入內存? – Pijotrek

+0

請參閱https://stackoverflow.com/questions/33019211/do-query-loads-all-the-data-in-memory – rmlan

+0

必須更改算法以僅使用當前記錄(當前:將所有記錄存入RAM)。順便說一句,爲什麼使用hibertate進行經典查詢? –

回答

3

根據你在做什麼與ro ws,處理這種情況的正確方法是使用LIMIT一次只檢索一部分結果。

然後,您可以循環查詢並在行可用時處理結果集。

SELECT * FROM hops WHERE processed IS NULL LIMIT 10000 

使用非本地查詢時,請參閱@ Stefano的答案。

1

實際問題是返回這樣一個大數據集。即使您增加了進程內存,當更多數據進入商店時,您仍然會遇到此問題。你可能想在這裏實現Paging。這是獲得有限的一小組數據,然後根據請求獲取下一頁。

+0

對。我曾經這樣想過,但我沒有一個領域,可以幫助我選擇一個小集合,然後另一個小集合等等 –

+0

這就像挑選一批處理爲空的數據。 –

+0

絕對正確。我將只設置一次處理過的空值,但現在它們都是空的。 –

1

我認爲有2種方式:

1.Pagination(選擇每個查詢n只有行)

Criteria c = session.createCriteria(Envelope.class); 
List<Envelope> list = c.setMaxResults(10).list(); 

2.Scrollable結果(類似一個JDBC結果)

Criteria c = session.createCriteria(Envelope.class); 
ScrollableResults scroll = c.scroll(ScrollMode.FORWARD_ONLY); 
while (scroll.next()) { 
    Envelope e = (Envelope) scroll.get(0); 
    // do whatever 
} 

您也可以使用一個StetelessSession

相關問題