繁体   English   中英

如何防止“本地事务已经有1个非XA资源”异常?

[英]How to prevent “Local transaction already has 1 non-XA Resource” exception?

我在无状态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 transcaction注释以避免此异常。 当我从javaFX applet调用这些方法时,所有方法都按预期工作。 现在我试图从JAX-RS webservice调用它们(我没有看到任何逻辑上的区别,因为在初始上下文中查找了ejb两种情况)并且我一直得到这个异常。 当我在glassfish 2.1连接池中设置XADatasource时,我在em2上得到了nullpointer异常。

任何想法接下来要尝试什么?

问候

好,

它现在已经解决了。 我将分享以防万一有人被类似的事情处理。 整个问题在于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>

现在就像一个魅力。

我在无状态EJB中使用2 PU,并且在一个方法上调用它们

确实。 但是你要从第一个方法调用第二个方法,所以你正在进行分布式事务,你需要使用XA(至少对于一个资源,因为GlassFish支持最后一个代理优化,允许涉及一个非XA资源)。 换句话说,将您的一个数据源设置为XADataSourceXADataSource的方法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM