multithreading事务在持久化实体中通过wildfly挂起到postgresql

我有一个像这样的entityManager的bean定义:

@Stateless public class JPABean { private static final Logger LOG = Logger.getLogger(JPABean.class); @PersistenceContext(unitName = "myPersistanceSettings") private EntityManager em; public void write(T o) { LOG.info("PERSISTING"); em.persist(o); LOG.info("FLASHING"); em.flush(); LOG.info("SUCCESS"); } 

我的persistance.xml

  org.hibernate.ejb.HibernatePersistence java:jboss/datasources/myDS        

我的api:

 @Path("activityAPI") public class ActivityAPI { private static final Logger log = Logger.getLogger(ActivityAPI.class); @EJB private JPABean activityJpa; @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response reportActivity(@Context HttpServletRequest hsr, final ActivityAPIRequest body) { ... 

我的带有数据源的standalone.xml:

   jdbc:postgresql://localhost/postgres postgres  10 100 true   postgres postgres   false false   false   

我收到了:

 2015-03-11 17:48:39,945 INFO [JPABean.write]: PERSISTING 2015-03-11 17:48:39,946 INFO [AbstractLoggingWriter.write]: INFO [JPABean.write]: PERSISTING 2015-03-11 17:48:39,946 DEBUG [TransactionCoordinatorImpl.attemptToRegisterJtaSync]: Skipping JTA sync registration due to auto join checking 2015-03-11 17:48:39,946 INFO [AbstractLoggingWriter.write]: DEBUG [TransactionCoordinatorImpl.attemptToRegisterJtaSync]: Skipping JTA sync registration due to auto join checking 2015-03-11 17:48:39,947 DEBUG [TransactionCoordinatorImpl.attemptToRegisterJtaSync]: successfully registered Synchronization 2015-03-11 17:48:39,947 INFO [AbstractLoggingWriter.write]: DEBUG [TransactionCoordinatorImpl.attemptToRegisterJtaSync]: successfully registered Synchronization 2015-03-11 17:48:39,947 DEBUG [AbstractEntityManagerImpl.joinTransaction]: Looking for a JTA transaction to join 2015-03-11 17:48:39,947 INFO [AbstractLoggingWriter.write]: DEBUG [AbstractEntityManagerImpl.joinTransaction]: Looking for a JTA transaction to join 2015-03-11 17:48:39,948 INFO [AbstractLoggingWriter.write]: Hibernate: select nextval ('hibernate_sequence') 2015-03-11 17:48:39,949 DEBUG [LogicalConnectionImpl.obtainConnection]: Obtaining JDBC connection 2015-03-11 17:48:39,949 INFO [AbstractLoggingWriter.write]: DEBUG [LogicalConnectionImpl.obtainConnection]: Obtaining JDBC connection 2015-03-11 17:48:39,950 DEBUG [LogicalConnectionImpl.obtainConnection]: Obtained JDBC connection 2015-03-11 17:48:39,950 INFO [AbstractLoggingWriter.write]: DEBUG [LogicalConnectionImpl.obtainConnection]: Obtained JDBC connection 2015-03-11 17:48:39,952 DEBUG [LogicalConnectionImpl.releaseConnection]: Releasing JDBC connection 2015-03-11 17:48:39,952 INFO [AbstractLoggingWriter.write]: DEBUG [LogicalConnectionImpl.releaseConnection]: Releasing JDBC connection 2015-03-11 17:48:39,953 DEBUG [LogicalConnectionImpl.releaseConnection]: Released JDBC connection 2015-03-11 17:48:39,953 INFO [AbstractLoggingWriter.write]: DEBUG [LogicalConnectionImpl.releaseConnection]: Released JDBC connection 2015-03-11 17:48:39,954 INFO [JPABean.write]: FLASHING 2015-03-11 17:48:39,955 INFO [AbstractLoggingWriter.write]: INFO [JPABean.write]: FLASHING 2015-03-11 17:48:39,957 INFO [AbstractLoggingWriter.write]: DEBUG [ActivityAPI.reportActivity]: POST Received PUT reportActivity 2015-03-11 17:48:39,957 DEBUG [EntityPrinter.toString]: Listing entities: 2015-03-11 17:48:39,957 INFO [AbstractLoggingWriter.write]: DEBUG [EntityPrinter.toString]: Listing entities: 2015-03-11 17:48:39,958 DEBUG [EntityPrinter.toString]: ActivityLogEntry{... body ...} 2015-03-11 17:48:39,958 INFO [AbstractLoggingWriter.write]: DEBUG [EntityPrinter.toString]: ActivityLogEntry{... body ...} 2015-03-11 17:48:39,959 INFO [JPABean.write]: PERSISTING 2015-03-11 17:48:39,959 INFO [AbstractLoggingWriter.write]: INFO [JPABean.write]: PERSISTING 2015-03-11 17:48:39,962 INFO [AbstractLoggingWriter.write]: Hibernate: insert into activity_log_entry (all columns) values (?, ?, ?, ?, ?, ?, ?, ?, ?) 

事实上,将2个实体持久化(插入)到表中存在问题。 我试图在我的公共写作方法和我的api上添加@Transactional注释,但它不起作用。 我也尝试使用@TransactionAttribute(TransactionAttributeType.REQUIRED),但它仍然是相同的。 使用EntityManagerFactory创建entityManager也不起作用(文档说entityManager不是线程安全的,但EntityManagerFactory是线程安全的)。 我在用着:

postgressql – 9.3 jboss-ejb-api_3.2_spec jboss-servlet-api_3.1_spec resteasy-jaxrs hibernate-entitymanager hibernate-validator driver postresql> 9.3-1102-jdbc41 wildfly 8.2 or wildfly 8.0

来自hibernate的日志:

 2015-03-11 17:53:39,947 WARN [SynchronizationCallbackCoordinatorTrackingImpl.afterCompletion]: HHH000451: Transaction afterCompletion called by a background thread; delaying afterCompletion processing until the original thread can handle it. [status=4] 

来自野生蝇的踪迹

 17:53:39,944 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000001:62455507:550071b3:35 in state RUN 17:53:39,945 WARN [com.arjuna.ats.arjuna] (Transaction Reaper Worker 0) ARJUNA012095: Abort of action id 0:ffff7f000001:62455507:550071b3:35 invoked while multiple threads active within it. 17:53:39,946 WARN [com.arjuna.ats.arjuna] (Transaction Reaper Worker 0) ARJUNA012108: CheckedAction::check - atomic action 0:ffff7f000001:62455507:550071b3:35 aborting with 1 threads active! 17:53:39,957 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000001:62455507:550071b3:3b in state RUN 17:53:40,445 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000001:62455507:550071b3:35 in state CANCEL 17:53:40,446 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012378: ReaperElement appears to be wedged: org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:231) org.apache.log4j.JBossAppenderHandler.doPublish(JBossAppenderHandler.java:42) org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:79) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:296) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304) org.jboss.logmanager.LoggerNode.publish(LoggerNode.java:304) org.jboss.logmanager.Logger.logRaw(Logger.java:721) org.jboss.logmanager.Logger.log(Logger.java:672) org.jboss.logging.JBossLogManagerLogger.doLogf(JBossLogManagerLogger.java:50) org.jboss.logging.Logger.logf(Logger.java:2096) org.hibernate.internal.CoreMessageLogger_$logger.rollbackFromBackgroundThread(CoreMessageLogger_$logger.java:1032) org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorTrackingImpl.afterCompletion(SynchronizationCallbackCoordinatorTrackingImpl.java:85) org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.afterCompletion(RegisteredSynchronization.java:56) com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.afterCompletion(SynchronizationImple.java:96) com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.afterCompletion(TwoPhaseCoordinator.java:532) 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) 17:53:40,457 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000001:62455507:550071b3:3b in state SCHEDULE_CANCEL 17:53:40,947 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff7f000001:62455507:550071b3:35 in state CANCEL_INTERRUPTED 17:53:40,948 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:ffff7f000001:62455507:550071b3:35 -- worker marked as zombie and TX scheduled for mark-as-rollback 17:53:40,949 WARN [com.arjuna.ats.arjuna] (Transaction Reaper) ARJUNA012110: TransactionReaper::check successfuly marked TX 0:ffff7f000001:62455507:550071b3:35 as rollback only 17:53:40,948 WARN [com.arjuna.ats.arjuna] (Transaction Reaper Worker 1) ARJUNA012095: Abort of action id 0:ffff7f000001:62455507:550071b3:3b invoked while multiple threads active within it. 17:53:40,949 WARN [com.arjuna.ats.arjuna] (Transaction Reaper Worker 1) ARJUNA012108: CheckedAction::check - atomic action 0:ffff7f000001:62455507:550071b3:3b aborting with 1 threads active! 17:53:40,949 WARN [com.arjuna.ats.arjuna] (Transaction Reaper Worker 1) ARJUNA012121: TransactionReaper::doCancellations worker Thread[Transaction Reaper Worker 1,5,main] successfully canceled TX 0:ffff7f000001:62455507:550071b3:3b 

我还看到我的transcations在postgressql中处于空闲状态:

 "idle in transaction";"select nextval ('hibernate_sequence')" "idle in transaction";"select nextval ('hibernate_sequence')" 

每个建议对我都非常有帮助:)

 org.apache.log4j.JBossAppenderHandler.doPublish(JBossAppenderHandler.java:42) 

这条线对我来说有点无意义,但最近我发现了意思……我在WebContent / META-INF文件夹中有一个log4j.xml的项目结构,我使用的是org.jboss.logging.Logger 。 不幸的是我没有得到任何错误,但这个文件的位置是错误的。 正如文档所述: https : //docs.jboss.org/process-guide/en/html/logging.html

log4j配置是从jboss服务器conf / log4j.xml文件加载的。

我发现问题与org.apache.log4j.ConsoleAppender完全相关。 删除它后我现在没有任何multithreading问题,我不需要任何注释,因为@TransactionalAttribute()默认设置为必需。 即使EntityManager不是线程安全的,也不需要使用EntityManagerFactory。

看一下: Log4j挂起我的应用程序我做错了什么?

我试图在我的公共写作方法和我的api上添加@Transactional注释,但它不起作用。

所有写入操作都需要Transactional上下文,尤其是在JTA环境中,其中使用了激进的连接释放 。 你需要添加:

 @TransactionAttribute(TransactionAttributeType.REQUIRED) 

你的write

 @TransactionAttribute(TransactionAttributeType.REQUIRED) public void write(T o) { LOG.info("PERSISTING"); em.persist(o); LOG.info("FLASHING"); em.flush(); LOG.info("SUCCESS"); }