我有一个下拉菜单,用户可以从中选择一个项目(在我正在处理的项目中),网页显示的大部分数据都取决于该选择。所以我有几个视图范围的bean调用EJB bean来执行依赖于所选项目的数据库查询。
我想缓存大部分数据以减少数据库查询,但是当用户更改项目时,它必须通知其他bean已发生更改并且需要获取新数据。
所以我有个主意:
projectChangeManager(会话范围的托管bean),保存选择的项目,在项目更改时通知其订阅者。在我清理观察者的地方实现了@PreDestory方法。
项目观察者(查看作用域的托管bean),根据项目选择从EJB获取数据,具有从EJB获取新数据的onProjectChange()方法。是否已实现@PreDestory方法,其中调用projectChangeManager.detach(this)以取消订阅projectChangeManager。
JSF中这种合理的方法吗?或者最好不要实现观察者模式,但只是当用户更改项目时,我获取所有缓存的数据并将其保存在会话bean中,然后在ViewScoped bean中我只是从SessionScoped bean访问该数据?或者有更好的方法吗?
答案 0 :(得分:1)
对我而言,这看起来像是过度工程。最初,我可能只是让每个托管bean在需要数据时调用存储库/ EJB。然后依赖持久层中的缓存(JPA / Hibernate /无论你使用什么)。
如果这是一个性能问题,您可以考虑一些手动缓存解决方案。
即使在这种情况下,我仍然没有看到你的观察者方法的优势。你的第二种方法(在会话bean中缓存,从ViewScoped bean访问)看起来更简单,也应该可以正常工作。
最后,如果您决定使用缓存,请考虑如何避免过时缓存。如果您按会话缓存,则一个会话中的更改将在另一个会话中不可见。顺便说一句,我认为这是将缓存留给持久层的另一个原因。