我在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!
答案 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 马诺哈尔