2015-03-13 6 views
1

я следующий код работает на Wildfly 8.0.0.Final:Wildfly 8.0.0.Final + EntityManager + PostgreSQL - простой в транзакции

@Stateful 
public class MyJPABean<T> { 

    @PersistenceContext(unitName = "myUnitName") 
    private EntityManager em; 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void write(T entity) { 
     em.persist(entity); 
     em.flush(); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void update(T entity) { 
     em.merge(entity); 
    } 
} 

Оба записи и обновления методы называются паралельно, так как они вызывается непосредственно из другого класса, который обрабатывает HTTP-запросы:

@Path("api") 
public class MyApiController { 

    private MyJPABean<MyJpaModel> jpaBean; 

    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public void handlePost(MyJpaModel myJpaModel) { 
     jpaBean.write(myJpaModel); 
    } 
} 

Некоторые из «записать» вызовы метода успешны, но время от времени, когда «писать» метод называется паралельно несколькими потоками, он начинает висеть на em.persist (entity).

На стороне сервера PostgreSQL я вижу транзакцию в состоянии: «idle in transaction» с запросом: «select nextval (« hibernate_sequence »)» или вставить запрос, который был создан из объекта, который я просто пытался сохранить.

Когда эта проблема возникает, я больше не могу останавливать объекты. Все висит на em.persist (entity). Либо я не могу убить процесс дикой природы, я должен убить его сигналом -9.

Есть ли что-нибудь, что я делаю неправильно?

Через некоторое время (когда происходит тайм-аут), я могу увидеть следующие предупреждения в журналах приложения:

16:44:30,590 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000101:-231d9b5d:55030494:2d in state RUN 
16:44:30,591 WARN [com.arjuna.ats.arjuna] (Transaction Reaper Worker 0) ARJUNA012095: Abort of action id 0:ffff7f000101:-231d9b5d:55030494:2d invoked while multiple threads active within it. 
16:44:30,591 WARN [com.arjuna.ats.arjuna] (Transaction Reaper Worker 0) ARJUNA012108: CheckedAction::check - atomic action 0:ffff7f000101:-231d9b5d:55030494:2d aborting with 1 threads active! 
16:44:30,598 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000101:-231d9b5d:55030494:35 in state RUN 
16:44:31,090 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000101:-231d9b5d:55030494:2d in state CANCEL 
16:44:31,092 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA: ReaperElement appears to be wedged: com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.afterCompletion(TwoPhaseCoordinator.java:487) 
com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.afterCompletion(TwoPhaseCoordinator.java:463) 
com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.cancel(TwoPhaseCoordinator.java:118) 
com.arjuna.ats.arjuna.AtomicAction.cancel(AtomicAction.java:215) 
com.arjuna.ats.arjuna.coordinator.TransactionReaper.doCancellations(TransactionReaper.java:377) 
com.arjuna.ats.internal.arjuna.coordinator.ReaperWorkerThread.run(ReaperWorkerThread.java:78) 

16:44:31,100 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000101:-231d9b5d:55030494:35 in state SCHEDULE_CANCEL 
16:44:31,594 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000101:-231d9b5d:55030494:2d in state CANCEL_INTERRUPTED 
16:44:31,595 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012120: TransactionReaper::check worker Thread[Transaction Reaper Worker 0,5,main] not responding to interrupt when cancelling TX 0:ffff7f000101:-231d9b5d:55030494:2d -- worker marked as zombie and TX scheduled for mark-as-rollback 
16:44:31,596 WARN [com.arjuna.ats.arjuna] (Transaction Reaper Worker 1) ARJUNA012095: Abort of action id 0:ffff7f000101:-231d9b5d:55030494:35 invoked while multiple threads active within it. 
16:44:31,597 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012110: TransactionReaper::check successfuly marked TX 0:ffff7f000101:-231d9b5d:55030494:2d as rollback only 
16:44:31,597 WARN [com.arjuna.ats.arjuna] (Transaction Reaper Worker 1) ARJUNA012108: CheckedAction::check - atomic action 0:ffff7f000101:-231d9b5d:55030494:35 aborting with 1 threads active! 
16:44:31,600 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000101:-231d9b5d:55030494:35 in state CANCEL 
16:44:31,602 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA: ReaperElement appears to be wedged: org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:231) 

в качестве драйвера JDBC, «PostgreSQL-9.2-1004.jdbc41» используется. Версия сервера PostgreSQL - «9,3». У меня также был c3p0 на пути к классам, но даже когда я удаляю эту зависимость, проблема apeears.

+0

Вы нашли решение? ;) http://stackoverflow.com/questions/28992996/multithreading-transaction-hanging-during-persisting-entity-to-postgresql-via-wi –

+0

Я узнал, что это происходит и в разных источниках данных (h2). Похоже, что есть проблема с менеджером wildfly jta. Все еще не знаю, что происходит. Если у кого-то есть пример приложения, где jaxrs используется вместе с ejb и jpa, пожалуйста, поделитесь, и я сравню. Я не хочу использовать весну. – Konrad

+0

Действительно ли 'MyJPABean ' действительно должен быть @Stateful? Такого рода сервисные бобы обычно @Stateless. Обратите внимание: это ошибка для нескольких потоков для одновременного доступа к одному экземпляру @Stateful bean. –

ответ

1

Я подготовил образец приложения, используя JAX-RS, EJB и JPA - https://github.com/aparnachaudhary/prototypes/tree/master/jaxrs-db-access. Я использовал сценарий JMeter для доступа к конечной точке REST с несколькими потоками. Но я не смог воспроизвести проблему с PostgreSQL 9.3, postgresql-9.3-1103.jdbc41.jar и WildFly 8.1.0.Final.

+0

Спасибо, я попробую и вернусь с результатами моих испытаний. – Konrad

+0

Ваше приложение работает нормально. Я попытаюсь сравнить различия (библиотеки, настойчивость и конфигурации источников данных). – Konrad

+0

http://stackoverflow.com/a/29080818/995199 –

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