2015-11-06 54 views
0

我寫了一個非常簡單的報告,在Java/JSF客戶,基本上在基於一些簡單的搜索條件MySQL數據庫返回表中的行(開始和結束日期等)。該數據庫包含大量的行,但過去存在一個限制,即只返回某種類型的行,並且這些行僅佔表的約1%。如何處理java.lang.OutOfMemoryError:正常超出GC開銷限制?

近日,客戶問我的一個複選框添加到搜索條件,讓他們可以繞過該行返回的限制。如果您選中該框並留下較大的日期範圍,則可以嘗試並檢索一個巨大的ResultSet,之後用戶通過愉快的消息重定向到Glassfish錯誤頁面:java.lang.OutOfMemoryError:GC開銷限制。

上崗每個響應我發現關於關於此錯誤基本上說「不要趕內存不足的錯誤」,我知道爲什麼:你不能真正預測,其中一個OOM錯誤將脫穎而出,即使你知道它是由什麼引起的。

我想知道如何處理這更優雅比雖然Glassfish的錯誤頁面。理想情況下,我希望能夠將用戶帶回搜索頁面,併發送一條消息,告訴他們如果標準太寬泛,就會縮小標準。在內存不足之前有沒有一種很好的方法可以做到這一點?或者是將在搜索結果的任意極限的最佳解決方案(也許先運行與計數查詢(),如果返回大於X,返回一個錯誤消息搜索頁面?)

+0

是的,這是不是有很好的理由。它表明一個真正的錯誤,而不僅僅是一個例外。您的選擇是對數據進行分頁,將結果進行流式處理而不將其全部保存在內存中或增加堆。 – jiggy

+0

對於無限大小的結果,您應該將它們串起來。例如使用基於遊標的方法並傳輸http輸出 – the8472

回答

0

我覺得最好的方法是使用分頁。用戶真正可以在屏幕上看到多少記錄?比方說100.因此,你顯示前100行和導航到下一個100行的下一頁。但是,當然,這取決於業務需求。

0

對於無限大小的結果,你應該串流而不是嘗試發送之前呈現在全頁面。

E.g.使用基於遊標的方法並傳輸http輸出。這樣服務器只需要保持有限的狀態,最壞的情況是用戶的瀏覽器由於大頁面而變得不可用。

相關問題