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

Session 如何杀死从jboss超时的db事务,session,transactions,jboss,jta,Session,Transactions,Jboss,Jta,我使用JBoss4.2.3 它具有设置“TransactionTimeout”(在jboss service.xml中),指定允许执行事务的时间 不幸的是,当超时时间过去时,执行不会立即中止,如果事务正在执行某些操作,则只会将其标记为稍后回滚 其效果是-当我有一个持久事务,线程在preparedStatement.execute上哭泣时,例如,当TransactionTimeout过去时,什么都没有发生,客户端仍然挂起,只有当preparedStatement完成时,事务才会回滚 我尝试了来自的

我使用JBoss4.2.3

它具有设置“TransactionTimeout”(在jboss service.xml中),指定允许执行事务的时间

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

其效果是-当我有一个持久事务,线程在preparedStatement.execute上哭泣时,例如,当TransactionTimeout过去时,什么都没有发生,客户端仍然挂起,只有当preparedStatement完成时,事务才会回滚

我尝试了来自的拦截器,但它只将线程标记为中断,大多数方法在执行时不会检查这一点,所以效果是相同的

我也尝试过设置preparedStatement.setQueryTimeout,但在Oracle(我们使用的)上,它会等待终止会话,直到Oracle愿意这样做(例如,它不会中止正在执行dbms\u lock.sleep的plsql过程)

我想终止与该事务相关联的数据库会话,该会话已超时-我知道它是哪个事务,它与哪个线程相关(因为我使用了上面给出的链接中的拦截器),但我不知道如何获取该事务绑定到的会话-我必须获取它,杀死它-然后线程将被中断


我是错过了更简单的解决方案,还是完全错了:)?

我不知道这个答案是否有用,因为它是JDBC级别的,可能是JBOSS抽象的,但试一试


您可以使用该方法取消运行JDBC语句,尽管其行为依赖于DBMS和数据库驱动程序。据我所知,它应该适用于Oracle数据库。您必须从执行该语句的线程之外的另一个线程调用cancel语句。

这似乎是的重复。这是相同的原则,只是服务器在完成之前结束,而不是客户端。

我在一个项目中遇到了类似的问题。我使用Hibernate连接部署在JBoss 1.4.2和MySQL 1.5.x上的web应用程序的数据库

我使用innotop来监视事务,它将在很长一段时间内保持活动状态。为了管理这些事务,我构建了一个外部应用程序(我的是一个web应用程序),它运行

  • 显示进程列表

    在数据库上,它给出了每个用户正在执行的查询列表和时间 它为之奔跑。其他详细信息包括queryId、用户、主机、数据库名称和状态

  • 我获取了事务,并使用queryID运行了一个
    kill XXXX
    命令,用于在指定时间间隔内运行的查询
  • 显示了Oracle中类似的内容


    同样,这可能不是解决这一问题的最理想方法我希望有更好的解决方案在更高的层次上处理问题。如果需要应用程序的源代码,请告诉我。

    刚刚就这个主题做了一些研究。有一个JTA配置参数InterruptThreads,默认为false。阅读文档,这意味着线程不会被中断,而只是像您所说的那样标记为回滚

    听起来这些选项是: 1) 将InterruptThreads(在jboss service.xml中)设置为true和 2) 还讨论了如何定义自己的“CheckedAction”类,该类包含在事务处理和终止过程中

    看起来在默认设置下,线程基本上可以回滚更新

    还有事务收割机配置,默认为2分钟-他们检查哪些事务可能超时-因此默认超时为5分钟,加上2分钟收割机-最坏的情况是,假设中断线程,您可以等待7分钟