2016-09-30 8 views
0

Я обновляю объекты в нашем приложении с версии EJB 2.0 до 3.0. Я использую openjpa версии 1.2.2 на веб-сервере (10.3.0), и тип транзакции будет 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, когда вы закончите с ним. В приведенном выше коде я не вижу, чтобы вы вызывали «close» в экземпляре «entityManager». Не делая этого, вы можете покинуть EntityManager в состоянии, так что он не может быть GC'd. Да, экземпляр «entityManager» привязан к самому методу, однако поставщик JPA все еще может сохранять структуры данных для EntityManager, поскольку он не знает, что EntityManager больше не используется (т. Е. Поскольку ему никогда не говорили «закрыть» ' Это).

Спасибо,

Heath

+0

Спасибо за ответ :) Исправлена ​​ошибка, я уже был с версии 1.1.0 и, следовательно, я использую 1.2.2, что дает мне указанную ошибку (см мой выбор) , Я также согласен, что это связано с проблемой транзакций weblogic/JTA, однако я пытаюсь понять, что именно вызывает эту проблему. Я также подтвердил, что это не проблема многопоточности, поскольку одна и та же ошибка возникает в среде с одним потоком. – Niru

 Смежные вопросы

  • Нет связанных вопросов^_^