2013-05-11 108 views
2

我有一個下拉菜單,用戶從中選擇一個項目(在我的案例中他正在處理的項目),網頁顯示的大部分數據取決於該選擇。所以我有幾個視圖範圍的bean調用EJB bean,這些bean執行依賴於所選項目的數據庫查詢。Observer和JSF ManagedBean

我想要緩存大部分數據以減少數據庫查詢,但是當用戶更改項目時,必須通知其他bean發生了更改並且需要獲取新數據。

於是我有了一個想法:

  • projectChangeManager(會話範圍的託管bean),節省了選擇哪個項目,通知它的訂戶項目變更時。在清理觀察者的地方實施了@PreDestory方法。

  • 項目觀察者(視圖作用域託管的bean),從基於項目選擇的EJB獲取數據,具有從EJB獲取新數據的onProjectChange()方法。在調用projectChangeManager.detach(this)以取消訂閱projectChangeManager時實施了@PreDestory方法。

在JSF中這是否合理?或者更好的是不實施觀察者模式,但只是當用戶更改項目時,我獲取所有緩存的數據並將其保存在會話bean中,然後在ViewScoped bean中,我只是從SessionScoped bean訪問該數據?或者,還有更好的方法?

回答

1

對我來說,這看起來像過度工程。最初,我可能會讓每個託管bean在需要數據時調用存儲庫/ EJB。然後依靠持久層中的緩存(JPA/Hibernate /無論你使用什麼)。

如果事實證明這是一個性能問題,您可以考慮一些手動滾動緩存解決方案。

即使在這種情況下,我仍然不太清楚你的觀察者方法的優點。你的第二種方法(緩存在會話bean中,來自ViewScoped bean的訪問)看起來更簡單,應該也可以工作。

最後,如果您決定使用緩存,請考慮如何避免陳舊的緩存。如果您按會話緩存,則一個會話中的更改在另一個會話中將不可見。順便說一下,我認爲這是將緩存留給持久層的另一個原因。

相關問題