Observer和JSF ManagedBean

问题描述 投票:2回答:1

我有一个下拉菜单,用户可以从中选择一个项目(在我正在处理的项目中),网页显示的大部分数据都取决于该选择。所以我有两个调用EJB bean的视图范围bean,它们执行依赖于所选项目的数据库查询。

我想缓存大部分数据以减少数据库查询,但是当用户更改项目时,它必须通知其他bean已发生更改并需要获取新数据。

所以我有个主意:

  • projectChangeManager(会话范围的托管bean),保存选择的项目,在项目更改时通知其订户。在我清理观察者的地方实现了@PreDestory方法。
  • 项目观察者(查看作用域的托管bean),基于项目选择从EJB获取数据,具有从EJB获取新数据的onProjectChange()方法。实现了@PreDestory方法,其中调用projectChangeManager.detach(this)来取消订阅projectChangeManager。

这是JSF中的合理方法吗?或者最好不要实现观察者模式,但只是当用户更改项目时,我获取所有缓存的数据并将其保存在会话bean中,然后在ViewScoped bean中我只是从SessionScoped bean访问该数据?或者,还有更好的方法?

jsf jsf-2 observer-pattern
1个回答
1
投票

对我来说,这看起来像过度工程。最初,我可能只是让每个托管bean在需要数据时调用存储库/ EJB。然后依赖持久层中的缓存(JPA / Hibernate /你使用的任何东西)。

如果这是一个性能问题,您可以考虑一些手动缓存解决方案。

即使在那种情况下,我仍然没有看到你的观察者方法的优势。您的第二种方法(在会话bean中缓存,从ViewScoped bean访问)看起来更简单,并且应该也可以正常工作。

最后,如果您决定使用缓存,请考虑如何避免过时缓存。如果您按会话缓存,则一个会话中的更改将在另一个会话中不可见。顺便说一句,我认为这是将缓存留给持久层的另一个原因。

© www.soinside.com 2019 - 2024. All rights reserved.