【问题标题】:JSF multiple calls to getter causing service timeoutJSF多次调用getter导致服务超时
【发布时间】:2012-04-09 07:39:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你不能使用分页吗?无论如何将该服务调用移至构造函数后...

标签: spring jsf richfaces


【解决方案1】:

JSF 托管的 bean getter 绝对不应该调用服务。他们应该只返回托管 bean 属性。这个属性应该已经由(post)constructor 或(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 的内存中是一个非常糟糕的主意。实现分页/过滤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    相关资源
    最近更新 更多