2012-07-29 24 views
2

在我的XPages Web應用程序(Xpages基於JSF的Lotus Notes技術)中,我需要一個動態映射來存儲會話ID和上次訪問的時間(以毫秒爲單位)。這在應用程序範圍的bean內以TreeMap實現。對應用程序的每次初始訪問都將當前會話註冊到此Bean中的TreeMap。此地圖只允許有限數量的會話條目,並且多餘的會話未註冊。地圖也會從舊會話條目中稍後清除,以便可以註冊新會話。 我需要知道這是否是可接受的方法/使用應用程序bean。我知道我可以將會話條目臨時存儲在外部數據庫(非蓮花筆記)中,但我正在爲之工作的公司不允許我這樣做。這種方法會導致我潛在的問題嗎?如果是的話,我有另一種方式來做到這一點?JSF - 嚮應用程序範圍Bean的廣泛讀寫

+0

這對我來說似乎絕對合法。對於應用程序範圍的bean IMO來說,這是一個完美的用例。我寧願將它存儲在數據庫中。 – Paranaix 2012-07-29 19:43:25

回答

5

這聽起來像是一個完全有效的應用程序bean的使用,但我會提供兩個建議。首先是使用ConcurrentSkipListMap而不是TreeMap。前者是線程安全的,而後者則不是。在與較低範圍進行交互時,線程安全性通常並不重要,因爲每個用戶只能寫入自己的會話,查看和請求範圍,但所有用戶都可以寫入應用程序範圍,因此可以想象,可能發生併發寫入,尤其是在用戶負荷很重的應用程序中第二個建議是要警惕每個會話有多少信息存儲在應用程序bean中。由於該bean可供所有用戶訪問,理論上可能會無意中向用戶公開太多關於用戶的信息。如果除了最後一次訪問時間之外,您只存儲會話名稱或ID,則無問題。但是,如果實際上存儲了指向每個用戶的會話作用域的指針,則可能會意外地爲用戶緩存的數據提供一個窗口,以使其他用戶無法訪問該數據。我從來沒有見過有人被此事咬過,但在應用程序範圍中存儲任何特定於用戶的信息時,始終牢記這一點非常重要。

1

事實上,這是對應用範圍的很好的使用。儘管如此,TreeMap收集不是您的具體情況最好的方法,也有一些問題是:

  • 併發問題時,2個請求要修改你的容器中的數據。
  • 如果您的應用程序必須水平擴展,您將在每個託管bean中擁有2個TreeMap

一個好方法是使用緩存系統。有很好的緩存庫可以滿足這些要求,我已經測試了ehcache,它提供了用於處理數據和庫的併發管理,以便在您有2個或更多節點來部署您的應用程序時,您也可以配置算法來清除緩存基於LRU(不常用)或FIFO(先進先出)。

使用外部數據庫來處理會話ID可能會花費一些時間來獲取/設置數據(它可能非常低,但仍然是磁盤I/O操作)。對於這個問題,你可以使用BigMemory作爲存放在RAM中的外部數據庫,或者像BigTable這樣的NoSQL數據庫。

注意:我不爲ehcache工作,也沒有以商業方式關聯,我測試過它並滿足我的需求。還有其他緩存系統庫,如您可以評估和使用的JBoss Cacheothers

相關問題