Как найти ОБА темы тупика? - PullRequest
5 голосов
/ 14 сентября 2010

У нас в Tomcat 5.5 работает классический стек spring / hibernate / mysql.Время от времени мы заходим в тупик, когда тайм-аут попытки заблокировать строку таблицы.Возникает какое-то исключение взаимоблокировки.

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

ВОПРОС: Есть ли способ найти другую ветку?

Спасибо!

Ян

Ответы [ 4 ]

1 голос
/ 14 сентября 2010

Попробуйте использовать следующую команду в MySQL в следующий раз, когда увидите тупик.Это должно показать вам последний тупик.

SHOW INNODB STATUS

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

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

0 голосов
/ 25 октября 2010

Если вам нужно найти поток, который содержит блокировку, вы можете сделать это в Eclipse через представление отладки. Взгляните на http://archive.eclipse.org/eclipse/downloads/drops/R-3.1-200506271435/eclipse-news-part2b.html и прокрутите вниз до «Отладка блокировок и тупиков».

Блокировки, принадлежащие потоку, а также блокировка, ожидающая поток, могут отображаться как встроенные в представлении «Отладка», переключая пункт меню «Показать мониторы» в раскрывающемся меню представления «Отладка». Потоки и блокировки, вовлеченные в тупик, выделены красным.

alt text

0 голосов
/ 25 октября 2010

если это проблема с кодом, вы можете попытаться подключиться к запущенному процессу с помощью jconsole и обнаружить тупик.

0 голосов
/ 23 октября 2010

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

  • on * nix отправка сигнала QUIT процессу ('kill -3 pid') сделает работу
  • используя jconsole / jvisualvm имеет возможность получить его
  • с использованием стандартного jdk jstack (рассмотрим опции -F -l) добьется цели
  • если вам повезет оказаться на солярисе, pstack очень поможет

Как только вы его получите, проанализируйте заблокированные / ожидающие потоки, чтобы найти тупик. Вы можете сделать это вручную или с помощью некоторых существующих анализаторов, которые используют алгоритмы обнаружения тупиковых ситуаций. Кстати, у jvm есть одна встроенная функция, и она может дать вам идею прямо в дампе потока.

Если я могу помочь больше, просто дай мне знать.

удачи.

С уважением, Баз

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