2015-03-13 70 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); 
    } 
} 

写和更新方法被称为平行的,因为它们是

@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。

+0

您是否找到解决方案? ;) http://stackoverflow.com/questions/28992996/multithreading-transaction-hanging-during-persisting-entity-to-postgresql-via-wi – 2015-03-13 16:38:49

+0

我发现它也发生在不同的数据源(h2)上。它看起来像野蛮jta经理有问题。仍然不知道发生了什么事。如果有人有一个示例应用程序,其中jaxrs与ejb和jpa一起使用,请分享,我会进行比较。我不想用春天。 – Konrad 2015-03-15 09:18:27

+0

'MyJPABean '确实需要@状态?这些服务bean通常是@Stateless。请注意,多个线程同时访问同一个@Stateful bean实例是一个错误。 – 2015-03-21 06:17:14

回答

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 2015-03-16 06:48:00

+0

你的应用程序工作正常。我将尝试比较差异(库,持久性和数据源配置)。 – Konrad 2015-03-16 08:15:09

+0

http://stackoverflow.com/a/29080818/995199 – 2015-03-16 15:36:57

相关问题