Как убить транзакцию db, время ожидания которой истекло из jboss

Пользуюсь jboss 4.2.3.

У него есть параметр TransactionTimeout (в jboss-service.xml), который указывает, как долго Transaction может выполняться.

К сожалению, когда время ожидания истекает, выполнение не прерывается прямо сейчас, если транзакция что-то делает, только она помечается для отката позже.

Эффект таков: когда у меня длительная транзакция, и поток, например, прерывается на подготовленном

Я попробовал перехватчик с http://management-platform.blogspot.com/2008/11/transaction-timeouts-and-ejb3jpa.html, но он отмечает только поток как прерванный, большинство методов не проверяют это при выполнении, поэтому эффект такой же.

Я пробовал также установить подготовленныйStatement.setQueryTimeout, но в Oracle (который мы используем) он ждет с прерыванием сеанса, пока оракул не захочет это сделать (например, он не прервет процедуру plsql, которая выполняет dbms_lock.sleep < / strong> (..)).

Я хотел бы убить сеанс базы данных, связанный с транзакцией, для которой истекло время ожидания - я знаю, какая это транзакция и с каким потоком она связана (потому что я использую перехватчик из ссылки, приведенной выше), но я не знаю как получить сеанс, к которому привязана транзакция - я должен получить его, чтобы убить его - и тогда поток будет прерван.

Мне не хватает более простого решения или я делаю его совершенно неправильно :)?


person ajuc    schedule 19.02.2011    source источник


Ответы (4)


Я не знаю, помогает ли этот ответ, поскольку он находится на уровне JDBC, который, вероятно, абстрагируется JBOSS, но попробуйте.

Вы можете отменить выполнение операторов JDBC, используя Statement.cancel (), хотя его поведение зависит от СУБД и драйвера базы данных. Насколько я знаю, он должен работать с базами данных Oracle. Вы должны вызвать оператор отмены из другого потока, чем тот, который его выполняет.

person MicSim    schedule 23.03.2011

Просто провел небольшое исследование по этой теме. Существует параметр конфигурации JTA InterruptThreads, для которого по умолчанию установлено значение false. Читая документы, это означает, что поток НЕ будет прерван, а просто помечен для отката, как вы сказали.

Похоже, есть следующие варианты: 1) установить для InterruptThreads (в ​​jboss-service.xml) значение true и 2) Также некоторое обсуждение определения вашего собственного класса CheckedAction, который включен в процесс обработки и завершения транзакции.

Похоже, что с настройками по умолчанию потоку в основном разрешено добраться до некоторой точки, где он откатит ваше обновление.

Также есть конфигурация жатки транзакций, которая по умолчанию составляет 2 минуты - где они проверяют, какие транзакции могли быть истекли - поэтому с таймаутом по умолчанию 5 минут плюс 2-х минутный жнец - худший случай, если вы прерываете потоки, вы можете подождать 7 мин.

person mikemil    schedule 15.04.2011

Это похоже на дубликат Что делать, если пользователь закрывает страницу в середине длинного запроса mysql?. Это тот же принцип, за исключением того, что сервер завершает его до завершения, а не клиент.

person Jeremy    schedule 24.03.2011

Я столкнулся с аналогичной проблемой в одном из моих проектов. Я использовал Hibernate для подключения к базе данных веб-приложения, развернутого на JBoss 1.4.2 с MySQL 1.5.x.

Я использовал innotop для отслеживания транзакций, которые оставались активными в течение длительного периода времени. Чтобы управлять этими транзакциями, я создал внешнее приложение (у меня было веб-приложение), которое запускало

  1. # P3 #
    # P4 #
  2. Я получил транзакции и выполнил команду kill XXXX, используя queryID для запросов, выполняемых через указанный интервал.

http://forums.oracle.com/forums/thread.jspa?threadID=906972 показывает нечто подобное в Oracle.

Опять же, это может быть не самый лучший способ справиться с этим. Я был бы признателен за лучшее решение, позволяющее решить проблему на более высоком уровне. Сообщите мне, если понадобится исходный код приложения.

person frictionlesspulley    schedule 24.03.2011