aju*_*juc 5 session jboss transactions jta
我使用 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感觉像这样做(例如,它不会中止正在执行dbms_lock.sleep(..)的plsql过程)。
我想终止与事务关联的数据库会话,该会话已超时 - 我知道它是哪个事务,以及它与哪个线程关联(因为我使用了上面给出的链接中的拦截器),但我不知道如何获取事务绑定的会话 - 我必须获取它,杀死它 - 然后线程将被中断。
我是否缺少更简单的解决方案,或者完全错误:)?
我不知道这个答案是否有帮助,因为它是在 JDBC 级别上,这可能是由 JBOSS 抽象的,但请尝试一下。
您可以使用Statement.cancel()方法取消正在运行的 JDBC 语句,但该行为取决于 DBMS 和数据库驱动程序。据我所知,它应该适用于 Oracle 数据库。您必须从执行该语句的线程之外的另一个线程调用取消语句。