2011-03-07 42 views
3

我們有一個應用程序,其中從存儲的proc結果集創建XML字符串,並使用XSLT進行轉換以返回到調用的servlet。這項工作適用於較小的數據集,但會導致大量數據出現內存不足錯誤。在這種情況下,理想的解決方案是什麼?從結果集輸出較大的xml

+0

多大? 10Mb或10Gb?它的確有所作爲。你提到servlets:所以它是Java。你確定你已經爲Java VM分配了足夠的內存嗎?默認值非常小。 – 2011-03-07 08:48:36

回答

1

如果您正在處理整個XML文檔,那麼聽起來好像您需要爲Java堆分配更多內存。但是,這隻適用於定義的最大堆大小。你知道一個合理的最大數據集大小還是無界的?

爲什麼你需要數據庫來生成XML?

+0

輸出是存儲過程調用的結果。代碼將遍歷結果集並創建XML。它是無限的。 – joesam232 2011-03-07 02:34:07

+0

然後去@ Edward的解決方案。 – Jeremy 2011-03-07 02:38:50

3

XSLT轉換通常需要將整個數據集加載到內存中,因此最簡單的方法是獲取更多內存。

如果您可以重寫您的XSLT,那麼XML的流轉換允許增量處理數據。

1

幾件重要的事情要注意。

您提到的功能在功能上與小型數據集功能相當,但會因內存較大而丟失數據。您需要確定是否創建導致內存不足或在同一進程中傳輸數據集的數據集。

你正在做的事情是讓很多對象留在記憶中。重新檢查你的代碼並在使用後明確地廢除一些對象。這將使垃圾收集器的生活更輕鬆。使用JVM的MaxPermSize設置。這將爲您提供額外的字符串空間。

這種方法將會有一個限制,即使您能夠爲單個用戶傳輸大型數據集,也可能會爲多個用戶使用OMeMemory。

一個可能適合你的建議。

  • 在Asyncronous過程中解決這個問題。創建大型數據集,分離進程和下載數據集的過程不同。

  • 使數據集可供下載時,您可以很好地控制使用基於流的下載的內存消耗。