我用的是jboss 4.2.3。
它具有设置“TransactionTimeout”(在jboss-service.xml中),指定允许事务执行多长时间。
不幸的是,当超时过去时,执行不会立即中止,如果事务正在执行某些操作,则只会将其标记为稍后回滚。
效果是-例如,当我有持久事务并且线程正在等待preparedStatement.execute时,当TransactionTimeout过去时,什么也没有发生,客户端仍然挂起,只有当preparedStatement完成时,才会出现事务被回滚的异常。
我尝试了拦截器http://management-platform.blogspot.com/2008/11/transaction-timeouts-and-ejb3jpa.html但它只是将线程标记为中断,大多数方法在执行时不会检查这一点,所以效果是相同的。
我也尝试过设置preparedStatement.setQueryTimeout,但是在Oracle(我们使用的)上,它会等待中止会话,直到oracle想要这样做(例如,它不会中止正在执行的plsql过程dbms_lock.sleep(..)).
我想终止与超时的事务关联的数据库会话 - 我知道它是哪个事务,以及它与哪个线程关联(因为我使用上面给出的链接中的拦截器),但我不知道如何获取事务绑定的会话 - 我必须获取它,杀死它 - 然后线程将被中断。
我是否错过了更简单的解决方案,或者做得完全错误:)?
刚刚对这个主题做了一些研究。有一个JTA配置参数InterruptThreads,默认为false。阅读文档,这意味着线程不会被中断,而只是像您所说的那样标记为回滚。
听起来选项是:
1)将InterruptThreads(在jboss-service.xml中)设置为true并且
2) 还有一些关于定义您自己的“CheckedAction”类的讨论,该类包含在事务处理和终止过程中。
看起来在默认设置下,线程基本上被允许到达某个点,它将回滚您的更新。
还有事务收割机配置,默认为 2 分钟 - 它们检查哪些事务可能已超时 - 因此默认超时为 5 分钟,加上 2 分钟收割机 - 最坏的情况,假设您中断线程,您可以等待7分钟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)