2010-12-07 72 views
2

我需要確認一個理論。我正在學習JSP/Java。JSP會話內存?

看過現有的應用程序(我沒有寫)後,我注意到我認爲導致我們的性能問題的東西。或者至少有一些。

它的工作原理是這樣的:

1)用戶打開搜索頁面。

2)搜索頁面(默認)會關閉所有行。其中329,000人。是。 329K。進入ArrayList。 ArrayList中的每個項目都是綁定到數據庫表的自定義JavaBean。

3)ArrayList然後傳遞給PaginateResultSet。 4)將PaginateResultSet(prs)(329k行)存儲在會話變量中: session.setAttribute(「resultSet」,prs); 5)每增加一個「下一頁」,然後從getAttribute(「resultSet」)抓取20行併發送到Ext數據網格。

好的,現在,我錯誤地認爲巨大的結果集存儲在每個用戶的每個線程的SERVER內存中?所以如果這個結果集佔用了20M內存,並且我們有20個併發用戶,那麼現在我們從服務器上獲得了400M的內存呢?

在會話屬性中傳遞這麼多數據不是一個壞主意嗎?

感謝您的指點。

回答

3

這是肯定是一個壞主意將整個數據庫表內容複製到Java的內存中,更不用說在多用戶環境中的用戶會話中。

您需要在數據庫級別進行分頁並在請求範圍內存儲只有感興趣的行。如何完成此操作取決於數據庫接口和使用的數據庫。如果您使用的是基本的JDBC,則可能會發現this answer有用。對於核心Hibernate或JPA,請參見this answer

+0

謝謝。這也是我的想法。他們正在使用Hibernate,但我不確定到底是什麼級別。這329k行正在快速增長。上週是27萬。因此,當我們發展到更多用戶時,這種方法真的開始崩潰。 – cbmeeks 2010-12-07 20:40:09