2016-09-30 3 views
0

アプリケーションのエンティティBeanをEJB 2.0から3.0にアップグレードしています。私はweblogicサーバ(10.3.0)上でopenjpaバージョン1.2.2を使用しており、トランザクションタイプはJTAになります。javax.transaction.SystemException:不正な状態(Expected:PrePrepared)です。 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 as 1.1.xと1.2.xは非常に古いです(WebLogicは特定のJPA/OpenJPAバージョンに「ハード配線」されている可能性がありますので、最初に確認する必要があります)。次に、私は潜在的なスレッドの問題についてここで不思議です。私はおそらくあまりにも多くの名前を作っていますが、あなたは "entityManagerSingleton.createEntityManager"と "EntityBeansMultiThreadTest"を持っていると思いますし、スタックはスレッドプールから開始するようです。私は真剣にすべてのスレッドの問題を見て、EntityManagerが複数のスレッドで使用されていないことを確認することをお勧めします!! JPA仕様は、EntityManagerがスレッドセーフではないことを明確にしています。 EntityManagerFactoryはスレッドセーフですが、EntityManagerでは使用できません。 2つ以上のスレッドが同じEntityManagerを使用していて、コードがTxに参加しコミットしていることを示しているため、スレッドが互いにぶつかることがあり、不正(不正な)Tx状態になる可能性があります。最後に、アプリケーション管理のエンティティマネージャを使用しているため、EntityManagerのライフサイクルを処理する必要があります。つまり、EntityManagerを終了する必要があります。上記のコードでは、 'entityManager'インスタンスで 'close'を呼び出すことはありません。これを行わないと、EntityManagerをGCできない状態にすることができます。はい、EntityManagerのインスタンスはメソッド自体にスコープされていますが、EntityManagerがもはや使用されていないことを知らないため、JPAプロバイダはEntityManagerのデータ構造を保持できます(つまり、 ' それ)。

おかげで、

ヒース

ご返信用
+0

感謝:)私が言及したバグが(私の編集を参照してください)バージョン1.1.0とあったので、私は1.2.2を使用していてくれたエラーを与えます。また、これはweblogic/JTAトランザクションの問題と関係がありますが、この問題の原因を正確に把握しようとしています。また、シングルスレッド環境で同じエラーが発生するため、これがマルチスレッドの問題ではないことも確認しました。 – Niru

関連する問題