与事务相关的线程在JBoss 6.1.0中暂停了很长时间

时间:2017-01-18 10:48:43

标签: java multithreading transactions jboss6.x

我在JBoss 6.1.0面临一个大问题。它是一个多线程应用程序,使用无状态EJB与BMT和Sybase DB。使用的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!

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

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

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

在我看来,您需要花费超过5分钟来处理邮件,因此其交易已超时。

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

答案 1 :(得分:0)

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

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

RGDS 马诺哈尔