session – 如何杀死从jboss超时的db事务

我使用jboss 4.2.3.

它设置了“TransactionTimeout”(在jboss-service.xml中),它指定允许Transaction执行的时间.

不幸的是,当超时通过时,执行不会立即中止,如果事务正在执行某些操作,则只会将其标记为稍后回滚.

结果是 – 当我有持久的事务并且线程正在使用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数据库.您必须从另一个线程调用cancel语句,而不是执行该语句的线程.

点赞