簡體   English   中英

觀察者和JSF ManagedBean

[英]Observer and JSF ManagedBean

我有一個下拉菜單,用戶可以從中選擇一個項目(在我正在研究的項目中為例),網頁顯示的大多數數據都取決於該選擇。 因此,我有幾個視圖范圍的bean,它們調用EJB bean,這些bean進行依賴於所選項目的數據庫查詢。

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

所以我有一個主意:

  • projectChangeManager(會話范圍的受管bean),保存選擇的項目,並在項目更改時通知其訂閱者。 在我清理觀察者的地方實現了@PreDestory方法。

  • 項目觀察者(查看作用域內的受管bean),基於項目選擇從EJB獲取數據,並具有onProjectChange()方法,該方法從EJB中獲取新數據。 已實現@PreDestory方法,其中調用projectChangeManager.detach(this)以取消訂閱projectChangeManager。

JSF中這種合理的方法嗎? 還是最好不要實施觀察者模式,而只是在用戶更改項目時才獲取所有緩存的數據,並將其保存在會話Bean中,然后在ViewScoped Bean中僅從SessionScoped Bean訪問該數據? 或者,還有更好的方法?

對我來說,這似乎是過度工程。 最初,我可能只是讓每個托管bean在需要數據時都調用存儲庫/ EJB。 然后依靠持久層中的緩存(JPA / Hibernate /無論使用什么)。

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

即使在那種情況下,我仍然不太明白您的觀察者方法的優勢。 您的第二種方法(在會話bean中緩存,從ViewScoped bean中訪問)看起來更簡單,並且應該也可以正常工作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM