Перехват TransactionRolledbackLocalException в Java - PullRequest
0 голосов
/ 16 июня 2010

Я получаю javax.ejb.TransactionRolledbackLocalException в Websphere 7 из контейнера, и мне интересно, как можно отловить это исключение? У меня установлено время ожидания в Websphere, и я получаю это сообщение по истечении этого времени. Я запускаю сессионные компоненты.

Я пытаюсь выяснить, какое SQl-выражение было причиной этого исключения. Где я могу найти это?

Ответы [ 3 ]

1 голос
/ 16 июня 2010

В соответствии с документацией Sun Вот основная рекомендация: если разумно ожидать, что клиент восстановится после исключения, сделайте его проверенным исключением.Если клиент не может ничего сделать для восстановления из исключения, сделайте его непроверенным исключением.

TransactionRolledbackLocalException является непроверенным исключением, и вы ничего не можете сделать, если это произойдет.Вы могли бы поймать это, как предлагает Аарон Дигулла в своем ответе, но какой в ​​этом смысл?

Если вы поймете это, вы будете возиться с внутренностями сервера приложений.Вы получите исключение на клиенте, и вы можете вызвать getCause () для исключения, полученного на клиенте, чтобы правильно уведомить пользователя.

У вас есть два решения

  1. Посмотрите начто вызывает тайм-аут (вероятно, плохой SQL)
  2. Увеличение времени ожидания
1 голос
/ 16 июня 2010

Транзакция откатывается при выполнении одного из двух условий:

  1. В вашем коде есть исключение
  2. Истекло время ожидания

Очевидно, что вы можете поймать исключение в случае № 1, обернув крайний код try{}catch().Но какой ваш код выполняется по таймауту?

Если ваш сервер приложений не предлагает API для подключения слушателя к таким событиям, это невозможно.См. Документацию, которую вы получили с продуктом, или обратитесь в службу поддержки для получения подробной информации.

[РЕДАКТИРОВАТЬ] Если вы хотите увидеть SQL, который фактически вызывает таймаут, у вас есть два варианта:

  1. Вы можете использовать java.sql.DriverManager.setLogWriter(w); для записи всех операторов SQL в файл.Хотя это всегда работает, это создаст много выходных данных, и будет трудно сопоставить это с исключением, если только вы не можете быть уверены, что только вы выполняете запросы.

  2. Если выиспользуйте OR mapper (например, Hibernate и т. д.), вы можете включить ведение журнала для них.См. здесь для Hibernate .

0 голосов
/ 28 января 2013

Вы также можете использовать [Log4JDBC] (https://code.google.com/p/log4jdbc/).. Это позволяет вести журнал перед драйвером.

Способ работает так, что вы указываете его в источнике данных как прокси.

Конечно, если вы используете hibernate, проще установить свойство show sql, но если вы используете JDBC, это будет работать, потому что все запросы проходят здесь.

...