Есть ли способ вызвать дамп потока JVM на исключение Oracle? - PullRequest
2 голосов
/ 24 октября 2011

У нас есть Java-программа, которая работает в Websphere и использует базу данных Oracle, используя прямой jdbc (без Hibernate или JPA).Наш клиент выполняет нагрузочное тестирование с использованием HP Performance Center, и он периодически получает исключения «тупиковой» ситуации Oracle под нагрузкой

Caused by: java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource

. Есть ли способ, как в коде, так и извне, вызвать такой же потокдамп вы получаете, когда вы kill -3 JVM, когда это исключение происходит?

Ответы [ 2 ]

7 голосов
/ 24 октября 2011

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

Мы делаем это постоянно.В основном мы используем:

Thread.setDefaultUncaughtExceptionHandler

, когда наше приложение запускается, а затем мы сбрасываем необходимую информацию при возникновении исключения:

  • Map<Thread, StackTraceElement[]> mst = Thread.getAllStackTraces();

  • Runtime.getRuntime().freeMemory() / maxMemory() / totalMemory() для получения основной информации о памяти

  • шаблон использования пользователем, если это приложение, с которым пользователь может взаимодействовать

  • домашняя "аналитика"

  • и т. Д.

Затем можно позвонить многодругих вещей и фантазии.Например, мы автоматически отправляем отчеты о сбоях (включая полную трассировку стека) на сервер, ожидающий таких трассировок.

1 голос
/ 24 октября 2011

Для текущего потока вы можете использовать Thread.dumpStack () .

Для всех потоков вы можете использовать Thread.enumerate () для получения всех запущенных потоков и dumpStack () каждого из них, или вы можете использовать Thread.getAllStackTraces () и выведите их на консоль или куда вам нужно.

Чтобы это произошло при возникновении таких исключений, если вы не можете сделать это в своем собственном коде, вы можете попробовать AOP, написать агент (если вы используете Java 6+) или вы можете, в крайнем случае, возьмите исходный код SQLException, измените его на дамп стека в его конструкторе, перекомпилируйте и поместите этот класс обратно в путь к загрузочному классу перед всем остальным.

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