JSF多次调用getter导致服务超时

时间:2012-04-09 07:39:18

标签: spring jsf richfaces

我正在使用JSF和spring。我在会话范围内有一个spring托管bean。我从服务电话获得一个相当大的列表。我正在调用服务并获取列表在绑定到jsf视图的getter中。当我运行应用程序时,多次调用getter。

所以在返回列表之前,它会再次被调用并超时。

列表是动态的我需要在页面加载时获取新列表,并且每分钟使用richfaces a4j poll刷新列表。必须每次从数据库中重新列出该列表。

如果我将bean更改为请求范围并将服务调用移至构造函数,则性能会更差。

任何人都可以提出更好的建议吗?

1 个答案:

答案 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的内存中是一个非常糟糕的主意。实施分页/过滤。

相关问题