2

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

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

于是我有了一个想法:

  • projectChangeManager(会话范围的托管 bean),保存选择的项目,在项目更改时通知其订阅者。在我清理观察者的地方实现了@PreDestory 方法。

  • 项目观察者(查看范围内的托管 bean),根据项目选择从 EJB 获取数据,具有从 EJB 获取新数据的 onProjectChange() 方法。在调用 projectChangeManager.detach(this) 以取消订阅 projectChangeManager 的地方实现了 @PreDestory 方法。

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

4

1 回答 1

1

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

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

即使在那种情况下,我仍然不太了解您的观察者方法的优势。您的第二种方法(在会话 bean 中缓存,从 ViewScoped bean 访问)看起来更简单,应该也能正常工作。

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

于 2013-05-11T15:57:50.640 回答