2009-06-02 19 views
1

我使用JDBC來獲取大量數據。呼叫成功完成,但是當resultSet.next()被調用時,我得到以下錯誤:結果集內存不足allocLargeObjectOrArray

java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 15414016, Num elements: 7706998 

我已經嘗試增加JVM內存大小,但這並不解決問題。我不確定這個問題甚至可以解決,因爲我沒有使用JDBC訪問數據庫,而是系統通過JDBC訪問BEA AquaLogic服務。

有沒有人遇到這個錯誤?

+0

你可以發佈更完整的堆棧跟蹤嗎? – Gandalf 2009-06-02 17:35:07

+0

你想從數據庫中讀取什麼? – 2009-06-11 10:48:26

回答

1

要小心,直到第一個resultSet.next()調用的結果可能還沒有從數據庫中讀取,或者仍然在另一個緩存結構中。

您應該嘗試限制您的選擇以返回相當數量的結果,並可能重複該呼叫,直到如果您需要所有數據都沒有更多結果。

除非您確定JDBC調用將返回的數據量存在絕對限制,否則增加JVM內存大小將無濟於事。

此外,訪問通過JDBC任何本質上的服務歸結爲使用JDBC :)

另一個(不太可能),一種可能是有在你使用JDBC驅動程序中的錯誤。如果可能的話嘗試一個不同的實現並檢查問題是否存在。

+0

我不會懷疑JDBC驅動程序是罪魁禍首。但是,我不能嘗試任何其他實現,因爲這是BEA特有的。獲取我正在尋找的信息還有其他方法,但這是當前的一大步。 – Nick 2009-06-21 03:53:57

+1

我還沒有真正有時間來解決這個問題。同時,我似乎能夠無誤地返回返回的數據。無論如何,我相信我的情況是一個邊緣案例。 接受這個答案,因爲它是最強大的。 – Nick 2010-02-15 19:33:12

0

您可以嘗試在您的語句中設置setFetchSize(int rows)方法。
但setFetchRows只是一個提示,這意味着它可能不會實現。

+1

由於只有一行正在返回,因此這不起作用。 – Nick 2009-06-21 03:51:32

0

嘗試將內存大小增加至1.2g,例如-mx1200m或者只是比你的機器的物理內存少。你可能會發現它一次讀取的數據比你想象的要多。

+1

我增加了我的內存,以至於JVM無法啓動應用程序,因爲它說我指定了太高的內存。我的機器也不是最牛的。 – Nick 2009-06-21 03:52:21

1

首先 - 找出是否真的需要一次獲得那麼多的數據。 RDBMS擅長聚合/排序/等大型數據集,如果可能的話,您應該儘量利用它。

如果沒有(並且出於某種原因,您真的確實需要大量工作內存中的數據)......並且撞上JVM的內存參數並不足以提高內存...查看內存分佈式緩存解決方案,如Coherence(COTS)或TerraCotta(開源)。

0

從數據庫返回多少行?像kosi2801我建議只取數據的一個子集,從一個合理的數字開始,然後增加找到閾值。