2010-04-21 37 views
6

我在无状态EJB使用2 PU和他们每个人的调用一个方法:如何防止“本地事务已有1个非XA资源”异常?

@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上出现空指针异常。

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

的问候,我在无状态EJB使用2 PU

+0

另请参阅http://stackoverflow.com/questions/2413911/if-i-access-usertransaction-does-this-mean-that-i-use-2-phase-commit-or-xa/2425585#2425585 – ewernli 2010-04-22 06:27:09

回答

5

好吧,

现在就解决了。我会分享,以防有人被类似的东西解决。 整个问题与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

和他们每个人的调用一个方法

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

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

+0

谢谢,我会尽快发布它,但在意图中,有没有办法在persistence.xml中指定XADataSource?我没有在任何地方找到它,每次我通过netbeans进行部署时,连接池中的glassfish设置都恢复为普通的DataSource。 – zeratul021 2010-04-22 07:20:34

1

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

相关问题