【问题标题】:How to prevent "Local transaction already has 1 non-XA Resource" exception?如何防止“本地事务已经有 1 个非 XA 资源”异常?
【发布时间】:2010-04-21 22:56:50
【问题描述】:

我在无状态 EJB 中使用了 2 个 PU,每个 PU 都在一个方法上调用:

@PersistenceContext(unitName="PU")
private EntityManager em;
@PersistenceContext(unitName="PU2")
private EntityManager em2;

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
public void getCandidates(final Integer eventId) throws ControllerException {
    ElectionEvent electionEvent = em.find(ElectionEvent.class, eventId);
    ...
    Person person = getPerson(candidate.getLogin());
    ...
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
private Person getPerson(String login) throws ControllerException {
    Person person = em2.find(Person.class, login);
    return person;
}

这些方法使用 REQUIRES_NEW 事务注释以避免此异常。当我从 javaFX 小程序调用这些方法时,一切都按预期工作。现在我试图从 JAX-RS webservice 调用它们(我没有看到任何逻辑差异,因为在这两种情况下 ejb 都是在初始上下文中查找的)并且我不断收到这个异常。当我在 glassfish 2.1 连接池中设置 XADatasource 时,在 em2 上出现空指针异常。

有什么想法可以尝试下一步吗?

问候

【问题讨论】:

标签: java persistence ejb transactions jax-rs


【解决方案1】:

好的,

现在解决了。我会分享,以防有人遇到类似的事情。 整个问题在于 netbeans 部署。它们会覆盖 glassfish 连接池中的设置,当您在运行时正确设置它们时,您会得到 npe 或缺少密码的傻东西。编辑它的地方是 sun-resources.xml。 XML 元素具有属性 datasource-classname 和 rs-type。对于 Derby 数据库需要做的是:

<jdbc-connection-pool ... 
        datasource-classname="org.apache.derby.jdbc.ClientXADataSource" 
        res-type="javax.sql.XADataSource">
   ...
</jdbc-connection-pool>

现在就像一个魅力。

【讨论】:

    【解决方案2】:

    我在无状态 EJB 中使用了 2 个 PU,每个 PU 都在一个方法上调用

    的确如此。但是您从第一个方法调用第二个方法,因此您正在执行分布式事务,并且您需要为此使用 XA(至少对于其中一个资源,因为 GlassFish 支持 last agent optimization 允许涉及一个非 XA资源)。换句话说,将您的数据源之一设置为XADataSource 是可行的方法。

    如果您在执行此操作时遇到错误,请添加有关您确切所做的操作和堆栈跟踪的详细信息。

    【讨论】:

    • 谢谢,我会尽快发布,但在meaninme,有没有办法在persistence.xml中指定XADataSource?我无法在任何地方找到它,每次我通过 netbeans 部署时,连接池中的 glassfish 设置都会恢复为普通数据源。
    • 这在 2021 年底对我很有用 :) 非常感谢 @Pascal。非常感谢堆栈溢出
    【解决方案3】:

    从第一个方法调用第二个方法时,它不是 EJB 方法调用。它将它视为只是一个常规的方法调用,而不是查看@TransactionAttribute。如果你想调用同一个 EJB,你可以注入 SessionContext 并调用 getBusinessObject。然后在返回的 EJB 上调用该方法。

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      相关资源
      最近更新 更多