Как убить транзакцию БД, которая истекла из Jboss - PullRequest
4 голосов
/ 19 февраля 2011

Я использую jboss 4.2.3.

Он имеет настройку "TransactionTimeout" (в jboss-service.xml), которая указывает, как долго разрешено выполнение транзакции.

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

Эффект - когда у меня длительная транзакция и поток прерываетсянапример, на prepareStatement.execute, и когда TransactionTimeout проходит, ничего не происходит, клиент по-прежнему зависает, только после завершения prepareStatement возникает исключение, что транзакция откатывается.

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

Я также пытался установить prepareStatement.setQueryTimeout, но в Oracle (который мы используем) он ожидает с отменой session, пока oracle не чувствует, что делает это (например, он не прервет процедуру plsql, которая выполняет dbms_lock.sleep (..)).

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

Я упускаю более простое решение или делаю это совершенно неправильно :)?

Ответы [ 4 ]

1 голос
/ 15 апреля 2011

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

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

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

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

1 голос
/ 24 марта 2011

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

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

0 голосов
/ 24 марта 2011

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

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

  1. show processlist

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

  2. Я выбрал транзакции и выполнил команду kill XXXX, используя queryID для запросов, выполняющихся в течение указанного интервала.

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

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

0 голосов
/ 24 марта 2011

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

...