2016-10-12 21 views
0

我有一個數據庫與一個擁有數百萬記錄的表。我使用spring jpa來訪問數據庫。現在,當我嘗試在該表上使用findAll()時,出現內存錯誤。該表的大小約爲150mb,我已經給jvm提供了1gb堆。我的問題是爲什麼它會消耗很多堆內存。 如果這不是正確的方法,我應該跟分頁,然後調用垃圾收集器。最好的方法來讀取在java中的巨大的數據庫表

回答

1

永遠不要在一次拍攝中獲取所有記錄,將所有值存入塊I.e頁,然後您將擺脫內存溢出問題。 Spring-data- *模塊可以幫助你有效地做到這一點。您可以將頁面作爲參數傳遞並檢索數據。

要實現的一個示例是findAll方法,它將參數pagable作爲參數返回給你頁面。

+0

當我這樣做,我應該明確地調用垃圾收集器? – user2784095

+0

不,jvm會照顧它,因爲我們的記憶不會急劇增長 – rajadilipkolli

0

Spring數據模塊提供了一種簡單(並且有點樸素)的方式來處理使用分頁的大型結果集。
如果你的要求是每次只顯示一大塊結果集,那麼Spring分頁就足夠了。

如果你需要顯示整個結果集(tipically日誌表)的,比你可以:

這個特性讓你執行一個查詢,並像Iterator一樣使用結果(或多或少)。
根據您定義的fetchSize,jvm內存將在結果集滾動期間逐漸加載。
使用此方法,您可以丟棄已發送給客戶端的記錄,僅保留內存中的最新記錄。

相關問題