2016-09-30 151 views
0

我正在将我们的应用程序中的实体bean从EJB 2.0升级到3.0版本。我在weblogic服务器(10.3.0)上使用openjpa 1.2.2版,交易类型为JTA。javax.transaction.SystemException:非法状态(预期:预先准备)。 BEA1-0A15322BC6A35D331713

我对着下面的错误,同时提交事务后坚持实体:

javax.transaction.SystemException: Illegal state (Expected: PrePrepared). BEA1-0A15322BC6A35D331713 at weblogic.transaction.internal.TransactionImpl.abortUnsync(TransactionImpl.java:1134) at weblogic.transaction.internal.ServerTransactionImpl.globalPrepare(ServerTransactionImpl.java:2172) at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:270) at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:230) at weblogic.transaction.internal.TransactionManagerImpl.commit(TransactionManagerImpl.java:283) at weblogic.transaction.internal.TransactionManagerImpl.commit(TransactionManagerImpl.java:277) at com.bt.cp.entities.EntityBeansMultiThreadTest$Loader.call(EntityBeansMultiThreadTest.java:104) at com.bt.cp.entities.EntityBeansMultiThreadTest$Loader.call(EntityBeansMultiThreadTest.java:78) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619)

下面的代码片段导致这个错误:

public Boolean call() throws Exception { 
         EntityManager entityManager = entityManagerSingleton.createEntityManager(); 
         UserTransaction tx = entityManagerSingleton.createTransaction(); 

         try { 
           tx.begin(); 
           // Join the EntityManager operations to this UserTransaction 
           entityManager.joinTransaction(); 

           entityManager.persist(new Party()); 

           tx.commit(); 

         } catch(Exception e) { 
           e.printStackTrace() 
         } 

         return true; 
       } 

下面是我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> 
    <persistence-unit name="testDataSource" transaction-type="JTA"> 
     <jta-data-source>testDataSource</jta-data-source> 
     <class>test.Party</class> 
     <class> 
     ......................... 
        </class> 
     <properties> 
      <property name="openjpa.QueryCache" value="true(CacheSize=1000)"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

没有见过OpenJPA的1.1.0版本(网络的一部分,此错误逻辑10.3.0)。但是,版本1.1.0(https://issues.apache.org/jira/browse/OPENJPA-466)存在一个主要错误,因此我使用的是版本1.2.2。

如何解决此问题?任何人都有这方面的指点。任何帮助表示赞赏。

回答

1

您声明OpenJPA存在一个错误。根据你发布的内容,我不会提出这种说法。事实上,“SystemException:Illegal State”似乎完全是WebLogic的堆栈;我没有看到堆栈上的OpenJPA。如果堆栈中有更多内容,并且发生OpenJPA异常,请将其发布到此处。否则,我认为你最好把它当作一个WebLogic的问题,特别是将它作为Tx处理。此外,如果可能的话,你应该转向更新的OpenJPA,例如2.2.x或2.4.x作为1.1.x和1.2.x的版本很老旧(尽管WebLogic可能与某些JPA/OpenJPA版本“硬连线”,因此您需要首先检查它们)。接下来,我想知道潜在的线程问题。我可能使得太多的名字,但我看到你有一个“entityManagerSingleton.createEntityManager”和“EntityBeansMultiThreadTest”,以及堆栈似乎从一个线程池开始。我建议你认真查看任何线程问题,并确保EntityManager不被多个线程使用! JPA规范明确指出EntityManager不是线程安全的。 EntityManagerFactory是线程安全的,但不是EntityManager。如果两个或多个线程正在使用同一个EntityManager,并且由于您的代码显示您正在加入并提交Tx,则这些线程可能轻松地彼此跺脚并导致错误的(非法的)Tx状态。最后,由于您使用的是应用程序管理实体管理器,因此您需要处理EntityManager的生命周期,这意味着您需要在完成后关闭EntityManager。在上面的代码中,我没有看到你在'entityManager'实例上调用'close'。通过不这样做,你可能会离开EntityManager到一个不能GC的状态。是的,'entityManager'实例的范围是方法本身,但是,JPA提供者仍然可以为EntityManager保留数据结构,因为它不知道EntityManager不再被使用(即因为它从未被告知'close ')。

感谢,

希思

+0

感谢您的答复:)我提到的错误是用1.1.0版本,因此我使用1.2.2这给了我提到的错误(请参阅我的编辑) 。我也同意这是与weblogic/JTA交易问题有关的事情,但是我试图找出造成这个问题的原因。我还证实,这不是多线程问题,因为在单线程环境中发生相同的错误。 – Niru