我有一个关于由JSF2托管bean范围机制(请求范围)引起的设计问题。

我正在使用primefaces4的tabview组件和datatable组件构建一个Web应用程序。每个选项卡都有一个数据表,该表具有从具有请求范围的托管Bean检索到的数据,该表使用JDBC从数据库中获取数据。因此,每次用户单击选项卡时,托管Bean将从数据库中检索数据。这就是整个体系结构的设计方式。很简单。

对每个ManagedBean使用@RequestScoped的目的是,用户希望在选择每个选项卡(每个请求)时从数据库中查看实时数据。所有其他范围都不适用。问题是,当用户选择一个选项卡时,将执行所有选项卡数据库访问逻辑。我认为这是因为Ajax调用请求,所以每个@RequestScoped bean都会被调用。

这导致两个缺点:
1.性能不好。用户需要等待4-5秒钟才能看到在执行所有bean之后出现的数据表。
2.太多无用的数据库访问。

我的解决方案是使用Spring调度程序来管理来自托管Bean的单独线程中的所有数据库访问,然后添加数据缓存层以与托管Bean进行交互。可以将Spring Scheduler设计为每10分钟访问一次数据库,轮询数据并将其放入数据缓存中。这样,受管bean将访问内存中的所有数据。然后,我想使用Primefaces Push API将数据推送到客户端,因此用户无需刷新浏览器。

显然它不是实时的,但是解决了2个问题。

还有其他更好或更简化的解决方案吗?

谢谢!

- - - -解 - - - - - -


将ManagedBean更改为sessionScoped
添加tabviewListener
添加tabview类以处理选项卡切换
在tabview类中,使用本文中的方法在运行时获取托管Bean。
JSF 2 : Accessing managed bean's instance in the phase listener object?
在tabview页面中,使用cache =“ true”可以提高性能,并让tabViewListner更新整个tabview组件,该组件将更新其中的数据表。

最佳答案

您应该更改要查看的bean,并更改页面逻辑以在单击选项卡时更新表,而不是在每次请求后都将整个bean扔掉。查看PrimeFaces ajax请求,然后单击选项卡,在Bean上调用一个方法,该方法检索可以由p:dataTable等引用的新数据。

07-24 09:27