Observer和JSF ManagedBean

Observer和JSF ManagedBean,jsf,jsf-2,observer-pattern,Jsf,Jsf 2,Observer Pattern,我有一个下拉菜单,用户可以从中选择一个项目(在我的项目中,他正在工作),网页显示的大部分数据都取决于该选择。因此,我有两个视图范围的bean,它们调用EJB bean,执行依赖于所选项目的数据库查询 我希望缓存大部分数据以减少数据库查询,但当用户更改项目时,它必须通知其他bean已发生更改,需要获取新数据 所以我有了一个想法: projectChangeManager(会话范围的托管bean)保存选定的项目,并在项目更改时通知其订户。已在我的位置实现@PreDestory方法 项目观察者(视图

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

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

所以我有了一个想法:

  • projectChangeManager(会话范围的托管bean)保存选定的项目,并在项目更改时通知其订户。已在我的位置实现@PreDestory方法

  • 项目观察者(视图范围的托管bean)根据项目选择从EJB获取数据,并使用onProjectChange()方法从EJB获取新数据。已在调用projectChangeManager.detach(this)以取消订阅projectChangeManager的位置实现@PreDestry方法


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

对我来说,这看起来像是过度工程。最初,我可能只是让每个托管bean在需要数据时调用repository/EJB。然后依赖于持久层中的缓存(JPA/Hibernate/无论您使用什么)

如果这是一个性能问题,您可以考虑一些手动滚动缓存解决方案。 即使在这种情况下,我仍然不太明白观察者方法的优势。第二种方法(在会话bean中缓存,从ViewScoped bean访问)看起来更简单,应该也能正常工作

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