JBoss 6.1.0中与事务关联的线程长时间挂起



我在JBoss 6.1.0中面临一个大问题。它是一个多线程应用程序,正在使用带有BMT和Sybase DB的无状态EJB。使用的JDK是1.7.76u。用户事务已启动。查询已运行,但关联线程在一小时后尝试提交。我不知道线程执行时发生了什么。它肯定是挂起的,但不是从代码中挂起的。

有人能给出一个有价值的指针,说明线程为什么被暂停了一个多小时吗。显然,一个小时后,线程恢复并尝试COMMIT或ROLLBACK将失败,并且已经失败,因为默认事务超时为300秒(这是JBoss 6的默认值)。

2017-01-09 10:01:49,389 DEBUG [TestDAO] [EventId: ] [pool-63-thread-6] SQL SELECT QUERY
2017-01-09 10:01:49,391 DEBUG [TestDAO] [EventId: ] [pool-63-thread-6] ['dao.rowsProcessed']: 1 rows processed
2017-01-09 10:01:49,389 DEBUG [TestDAO] [EventId: ] [pool-63-thread-6] SQL UPDATE QUERY
2017-01-09 10:01:49,391 DEBUG [TestDAO] [EventId: ] [pool-63-thread-6] ['dao.rowsUpdated']: 1 row updated
2017-01-09 11:05:48,213 DEBUG [DAOUtils] [EventId: ] [pool-63-thread-6] commitTx
2017-01-09 11:05:48,214 ERROR [DAOUtils] [EventId: ] [pool-63-thread-6] commitTx() ARJUNA-16063 The transaction is not active!
2017-01-09 11:05:48,215 DEBUG [DAOUtils] [EventId: ] [pool-63-thread-6] rollbackTx
2017-01-09 11:05:48,215 ERROR [DAOUtils] [EventId: ] [pool-63-thread-6] rollbackTx() java.lang.IllegalStateException - BaseTransaction.rollback - ARJUNA-16074 no transaction!

似乎有长时间运行的事务超时。

"事务未激活!"是由事务超时引起的。当事务超时时,事务管理器异步回滚,然后当组件试图再次访问事务(例如提交或回滚)时,它将无法根据JTA规范进行访问。

默认事务超时已在应用程序服务器配置中的"transactions"子系统的"default timeout"属性下定义。

  • 默认值为300秒/5分钟。

  • 您可以修改该值以增加默认事务超时。

  • 您可以将该值设置为0以禁用事务收割器/事务超时。

必须重新启动应用程序服务器VM才能应用默认超时更改。

<subsystem xmlns="urn:jboss:domain:transactions:1.4">
<coordinator-environment default-timeout="300"/>  <!-- HERE -->
</subsystem>

在我看来,处理消息需要5分钟以上的时间,因此其交易超时。

我建议您将事务超时增加到一个更高的数字,以避免这种情况。如果您能够重构应用程序代码以减少完成事务所需的时间,那将是一件好事。因此,在这种情况下,应用程序逻辑可能正确地处理了的场景

正如我在JBoss论坛中提到的,这与事务超时无关。延长事务的超时没有意义,因为这会阻塞所有其他应用程序,因为数据库中的锁由事务持有。

执行事务的线程被冻结。任何关于为什么这个线程被阻止提交的提示都将非常有帮助。

RgdsManohar

最新更新