2010-03-25 108 views
1

我們應該使用什麼技術使httpsession對象不會大量加載數據。會話中存儲的數據量

實施例:

請求1 ----> HttpSession中裝載有50000個不同對象的ArrayList。 session.setAttribute( 「數據」,數組列表);

請求2 ----> httpSession加載了一個40,000個不同對象的數組列表。 session.setAttribute( 「數據」,數組列表);

假設服務器負載很重,其中包含多個會話和大量數據。讓我們從上面的示例請求1..1000一次。這意味着1000個具有大量數據的會話對象。

什麼是替代方法來解決,而不是像這樣在會話中存儲它們?

+0

什麼是需要在會話中存儲這麼多數據的用例? – Eduardo 2010-03-28 14:59:20

回答

3

一些想法:

  1. 更有選擇性哪些數據您真正需要服務的,而不是你只能加載數據的第一個請求在會話plonking一切你的客戶,當客戶真正需要它(C.Q。當用戶點擊標籤時)。您還可以使用專門的輕量級類而不是完整的後端域類將數據傳遞到前端。

  2. 檢查您的域模型,並查看是否可以拆分出任何「靜態數據」。我的意思是通常在你的應用程序中共享的數據,並且不會有很大的變化,比如郵編。這種類型的數據非常適合緩存和傳遞參考,而不是複製它。

  3. 如前所述,使用Ehcache之類的緩存框架。它減少了對應用程序中管道代碼的需求,並允許跨所有會話共享緩存而不是複製數據。當然,如果你只是在會話中存儲用戶特定的數據,那麼共享將不會有很大的好處。像這樣的框架還允許您配置緩存策略,例如,以便在必要時它將開始使用數據庫。

2

要麼將​​其放入應用程序範圍(如果它不是用戶特定的),要麼將其替換爲基於請求的數據庫端分頁/過濾(如果它是用戶特定的)。

我想這些數據已經存儲在數據庫中了。將它放到應用程序範圍中並沒有多大意義。當Java代碼在Java內存中拖拽/複製數據存儲(例如RDBMS)的數據集時,您將始終存在內存問題,然後使用Java代碼在Java內存中執行正確的工作。當你甚至將它存儲/複製到一個web應用程序的會話範圍內時,情況確實會變得更糟。

內存效率最高的方法是讓數據庫完成它發明的任務。 SQL語言根據每個ORDER BY子句進行排序,WHERE子句進行篩選,並且(DB供應商特定的)LIMIT/OFFSET子句/子子查詢/子函數僅返回基於第一行行記錄的記錄子集lastrow。這樣你最終只能得到 Java內存中實際要顯示的數據集。

你可以在這裏發佈的this answer中找到需要的SQL查詢的例子。希望這可以幫助。

+0

我說的是,儘管你在1000年的會話中存儲對象(任何要求,應用程序..),我想要的方式不佔用更多的內存。可能我要找的是一些不錯的設計模式或內存管理。 – srinannapa 2010-03-25 11:48:43

+1

我想你不理解我。你需要這1000個物體用於什麼?要立即顯示給最終用戶?不,這是行不通的。只有100個項目已經很快被顯示出來了。 Google也不會在單個頁面中同時顯示大量鏈接。他們將數據保存在數據庫中,並使用過濾和分頁功能在內存中只存儲有限集合並顯示它們。您應該這樣做:將數據保存在數據庫中並瞭解SQL的功能。 – BalusC 2010-03-25 11:50:58

+0

你只是在談論數據庫檢索,可能我正在尋找像「鮑里斯帕夫洛維奇」上面提供的答案。 – srinannapa 2010-03-25 11:57:01

0

如果您在視圖中使用數據,則可以在請求上設置屬性,或使用表單。如果您需要在會話處於活動狀態時收集數據,請將其放入數據庫中。

0

我建議你嘗試的兩個備選方案之一:

  • 存儲用戶特定的數據庫中數據的
  • 使用緩存系統,如EhCachememcached
1

商店只有唯一標識符留在共享池(內存,分貝,平面文件)的對象

+0

是的,我正在尋找一些這樣的東西你有任何這樣的示例/ scneario – srinannapa 2010-03-25 11:57:47