【问题标题】:EJB method being called multiple timesEJB 方法被多次调用
【发布时间】:2019-12-20 16:36:07
【问题描述】:

我正在 Payara 5 服务器上开发 JEE8 应用程序。我在我的一个无状态 EJB 中有一个方法,我只调用一次(从 JSF 页面),但在服务器端它被调用多次执行。我也在 Payara5.192、Payara 5.193 和 Glassfish 5 上尝试过这种方法。但我一直遇到同样的问题。下面的代码 -

@Override
    public List<Forum> getForums(int startIndex, int size) {
        TypedQuery<Forum> tQ=em.createQuery("select f from Forum f", Forum.class);
        tQ.setFirstResult(startIndex);
        tQ.setMaxResults(size);
        List<Forum> toReturn=tQ.getResultList();
        LOGGER.info("Forums extracted "+toReturn.size());
        return toReturn;
    }

如果我从索引 0 开始分页,结果大小为 5,LOGGER.info 会生成以下日志,看起来很荒谬!

Info:   Forums extracted 5
Info:   Forums extracted 5
Info:   Forums extracted 5
Info:   Forums extracted 5
Info:   Forums extracted 5
Info:   Forums extracted 5

此外,这个循环的次数也不是固定的。它可以执行 15-30 次。而我显然只期望一条日志消息。

【问题讨论】:

  • 还记录传入参数、startIndex 和大小。是同一个电话吗?
  • @pirho,是的,它们确实是相同的参数。事实上,我在问题陈述中确实提到了这一点——“如果我从索引 0 开始分页,结果大小为 5”。感谢您对此进行调查。
  • 是的,我注意到了这一点,但实际上我想知道的是,如果唯一的调用 0/5 会以某种方式生成对 5/5 和 10/5 等的调用。 ..但显然事实并非如此。
  • 您能否提供更多上下文信息,例如 JSF 视图、支持 bean 和您的无状态 EJB?

标签: jpa ejb payara


【解决方案1】:

如果您使用 #{managedBean.forums} 作为 JSF 组件的值,您的方法可能会被多次调用,因为任何时候组件需要访问数据时都会调用 getter。

在 JSF 中执行此操作的方法是实现一个加载数据的方法,并从 @PostConstruct 方法调用它,并且每次您需要重新加载数据时。 JSF 组件的 value 属性中使用的方法应该是一个只返回数据的简单 getter:

private List<Forum> forums;

public List<Forum> getForums() {
    return forums;
}

@PostConstruct
private void init() {
    loadForums();
}

public void loadForums() {
    TypedQuery<Forum> tQ=em.createQuery("select f from Forum f", Forum.class);
    tQ.setFirstResult(startIndex);
    tQ.setMaxResults(size);
    forums =tQ.getResultList();
    LOGGER.info("Forums extracted "+forums.size());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2013-04-03
    相关资源
    最近更新 更多