我正在使用JSF和spring。我在会话范围内有一个spring托管bean。我从服务电话获得一个相当大的列表。我正在调用服务并获取列表在绑定到jsf视图的getter中。当我运行应用程序时,多次调用getter。
所以在返回列表之前,它会再次被调用并超时。
列表是动态的我需要在页面加载时获取新列表,并且每分钟使用richfaces a4j poll刷新列表。必须每次从数据库中重新列出该列表。
如果我将bean更改为请求范围并将服务调用移至构造函数,则性能会更差。
任何人都可以提出更好的建议吗?
答案 0 :(得分:1)
JSF托管bean getter绝对不应该调用服务。他们应该返回托管bean属性。此属性应该已由(post)构造函数或(action)侦听器方法准备。这些方法将被恰好调用一次。由于JSF需要访问该值,因此将多次调用Getter。
您需要重写代码,以便第一次作业在托管bean的(post)构造函数中完成,并且<a4j:poll>
调用一个刷新列表并且getter执行的侦听器方法除了归还财产之外别无其他。
这是使用标准Java EE 6工件的基本启动示例。我不做Spring,但你应该能够用Spring工件取代它。
@ManagedBean
@SessionScoped
public class Bean {
private List<Entity> entities;
@EJB
private EntityService service;
@PostConstruct
public void load() {
entities = service.list();
}
public List<Entity> getEntities() {
return entities;
}
}
与
<a4j:poll action="#{bean.load}" interval="60000" render="someTableId" />
无关具体问题:如果你有一个相当大的数据库表(> 1000行),那么将整个数据库表复制到Java的内存中是一个非常糟糕的主意。实施分页/过滤。