2008-12-17 55 views
2

那麼,我們有一個運行在JBoss上的web應用程序,當試圖在postgres數據庫的多個表中插入很多行時,就會出現「OutOfMemory」錯誤。 這是此錯誤的完整環境:
* JBoss的4.3.x版GA
*的Java 1.6.0
*休眠3.0
* PostgreSQL的8.3(駕駛員)
關於實際代碼的工作環境:
*關於這一點的重要部分是我們正在解析大量的xml文檔,每個文檔都從一個特定的URL(1 URL = 1 XML)分開下載。我們通過擁有一個將生成的URL分發到隊列的EJB來實現這一點,然後一組MDB使用流連接並生成文檔(請注意,由於XML文檔的大小,我們實際上必須提高堆棧內存,而我們由於不得不將所有文檔都放在一個流中),一旦生成文檔,就會轉到其他MDB池偵聽的另一個隊列。
那些MDB解析文檔,將信息存儲在幾個實體中(至少5個),然後在DB中持久化(請注意事務管理設置爲「BEAN」並且在每個MDB工作期間開始並提交)。處理URLs不是一個選項,因爲要處理的URL的數量,這將需要大約2個月左右...大聲笑
在Java中使用Postgres的內存不足

麻煩是......我們解析和存儲像200個URL左右和開始解決postgreSQL的內存錯誤。 任何想法??

在此先感謝!

另外:它可能是有用的,知道這個錯誤沒有出來之前(我解析了幾千個XML的信息),只生成文件和解析它的一些實體似乎並沒有帶來麻煩。當我們開始將越來越多的文檔解析爲其代理實體時,麻煩就開始了。 (就像一個實體有一個「功能」列表[其他實體從同一個XML解析])

+0

當你說「失控的內存對於PostgreSQL」,你的意思是你的JBoss的情況下拋出一個異常,或者你的意思是PostgreSQL的後臺程序本身運行內存? – 2008-12-17 13:23:49

+0

Java堆棧跟蹤中顯示異常,但我認爲它是在PostgreSQL一側生成的。 – 2008-12-17 13:33:47

回答

2

這聽起來像你保留所有200文件在內存中的所有豆。

不是將所有數據全部保存在RAM中,而是儘可能快地將其清除。

因此,當您完成讀取某些bean的數據時,堅持並忘記它(將對象引用設置爲null),除了可能需要創建引用的鍵。

如果您無法做到這一點,請使用分析器確保您在解析文檔後不保留對文檔的引用。通常,在將數據保存在數據庫中後,您無需將整個文檔保留在任何地方。如果這是一個問題,請創建一個帶引用的表格,它允許您在文檔之間進行鏈接,並將該表格中的鍵保存在內存中(而不是整個文檔)。

1

簡短的回答是更多信息是必需的。我建議使用像JProfiler這樣的工具來幫助理解內存正在被消耗的位置。

根據您描述的設計:爲什麼使用兩個池?如果您只有一個用於URL的池,那麼工作線程可以從該池中取出,解析該URL並創建實體bean,並將它們保存到數據庫中。

目前尚不清楚爲什麼您需要中間XML步驟,這聽起來像是高內存消耗的可能來源。