session - 如何杀死从jboss超时的数据库事务

标签 session transactions jboss 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(我们使用的)上,它会等待中止 session ,直到oracle感觉喜欢这样做(例如,它不会中止正在执行 dbms_lock.sleep (. .))。

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

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

最佳答案

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

听起来选项是:
1) 将 InterruptThreads (在 jboss-service.xml 中) 设置为 true 并且
2)还有一些关于定义您自己的“CheckedAction”类的讨论,该类包含在事务处理和终止过程中。

看起来使用默认设置,线程基本上被允许到达某个点,它将回滚您的更新。

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

关于session - 如何杀死从jboss超时的数据库事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051277/

相关文章:

java - 为什么 session 超时后无法访问 servlet?

java - session 超时处理 -( session 自动过期时更新特定用户行)

Php session 文件权限

java - @Transactional 问题以及如何与@Service 一起使用

java - 避免 Java Web 应用程序中的乐观锁定

java - 将 .war 文件转换为正确的版本

java - 有状态 session Bean 的超时设置?

jboss - 使用Jboss资源适配器连接ActiveMQ时配置sendTimeout

php - 在设置用户偏好时,是否最好使用 cookie 作为 session ? (PHP)

sql-server - 让 SQL 等待直到前一条语句完成