Wildfly 8.0.0.Final + EntityManager + PostgreSQL - простаивает в транзакции

1

У меня есть следующий код, запущенный на Wildfly 8.0.0.Final:

@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);
    }
}

Некоторые вызовы метода "write" успешны, но время от времени, когда метод "write" называется параллельным несколькими потоками, он начинает зависать на 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) ARJUNA012378: 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) ARJUNA012378: 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
    Вы нашли решение? ;) stackoverflow.com/questions/28992996/…
  • 0
    Я узнал, что это происходит также на разных источниках данных (h2). Похоже, что есть проблема с диспетчером JTA Wildfly. Все еще не знаю, что происходит. Если у кого-то есть пример приложения, в котором jaxrs используется вместе с ejb и jpa, пожалуйста, поделитесь, и я сравню. Я не хочу использовать весну.
Показать ещё 1 комментарий
Теги:
hibernate
entitymanager
wildfly

1 ответ

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
    Спасибо, я постараюсь вернуться с результатами моего теста.
  • 0
    Ваше приложение работает нормально. Я попытаюсь сравнить различия (библиотеки, постоянство и конфигурации источника данных).
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню