我已經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);
}
}
寫和更新方法被稱爲平行的,因爲它們是
@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);
}
}
一些「寫」的方法調用是成功的,但不時,當「寫」的方法是通過多線程並行地調用,它開始:直接從另一個類處理HTTP請求被稱爲掛在em.persist(實體)上。
在PostgreSQL服務器端,我可以看到事務處於狀態:「idle in transaction」with query:「select nextval('hibernate_sequence')」或者插入從我試圖保留的實體創建的查詢。
發生此問題時,我無法再堅持實體。一切都掛在em.persist(實體)上。要麼我不能殺死野蠻的過程,我必須用-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。
您是否找到解決方案? ;) http://stackoverflow.com/questions/28992996/multithreading-transaction-hanging-during-persisting-entity-to-postgresql-via-wi – 2015-03-13 16:38:49
我發現它也發生在不同的數據源(h2)上。它看起來像野蠻jta經理有問題。仍然不知道發生了什麼事。如果有人有一個示例應用程序,其中jaxrs與ejb和jpa一起使用,請分享,我會進行比較。我不想用春天。 – Konrad 2015-03-15 09:18:27
'MyJPABean'確實需要@狀態?這些服務bean通常是@Stateless。請注意,多個線程同時訪問同一個@Stateful bean實例是一個錯誤。 –
2015-03-21 06:17:14