jjzjj

java - 如何防止 "Local transaction already has 1 non-XA Resource"异常?

coder 2024-03-12 原文

我在无状态 EJB 中使用了 2 个 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 applet 调用这些方法时,一切都按预期工作。现在我试图从 JAX-RS web 服务调用它们(我没有看到任何逻辑差异,因为在这两种情况下,ejb 都是在初始上下文中查找的)并且我不断收到此异常。当我在 glassfish 2.1 连接池中设置 XADatasource 时,我在 em2 上遇到空指针异常。

知道接下来要尝试什么吗?

问候

最佳答案

好的,

现在已经解决了。我会分享以防万一有人遇到类似的事情。 整个问题出在 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>

现在就像一个魅力。

关于java - 如何防止 "Local transaction already has 1 non-XA Resource"异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2687121/

有关java - 如何防止 "Local transaction already has 1 non-XA Resource"异常?的更多相关文章

随机推荐