0

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

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

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

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

谁能建议一个更好的架构来做到这一点?

4

1 回答 1

1

JSF 托管的 bean getter 绝对不应该调用服务。他们应该只返回托管 bean 属性。这个属性应该已经由(post)构造函数或(action)listener 方法准备好了。这些方法将被调用一次。当 JSF 需要访问该值时,将多次调用 Getter。

您需要重写您的代码,以便第一次工作在托管 bean 的(后)构造函数中完成,并且<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" />

也可以看看:


与具体问题无关:如果您有一个相当大的 DB 表(>1000 行),那么将整个 DB 表复制到 Java 的内存中是一个非常糟糕的主意。实现分页/过滤。

于 2012-04-10T13:00:24.497 回答