【发布时间】:2015-05-16 05:02:01
【问题描述】:
我在 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);
}
}
write 和 update 方法都是并行调用的,因为它们是直接从另一个处理 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) 上。要么我无法杀死wildfly进程,我必须用-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,但即使我删除了这个依赖项,问题还是出现了。
【问题讨论】:
-
您找到解决方案了吗? ;) stackoverflow.com/questions/28992996/…
-
我发现它也发生在不同的数据源 (h2) 上。看起来wildfly jta manager有问题。还是不知道怎么回事。如果有人有一个示例应用程序,其中 jaxrs 与 ejb 和 jpa 一起使用,请分享,我会比较。我不想使用弹簧。
-
MyJPABean<T>真的需要@Stateful 吗?这些服务 bean 通常是 @Stateless。请注意,多个线程同时访问同一个@Stateful bean 实例是错误的。
标签: java hibernate postgresql wildfly entitymanager