2013-05-11 57 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的访问)看起来更简单,应该也可以工作。

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