2010-09-13 14 views
5

Nous avons la pile classique spring/hibernate/mysql sous Tomcat 5.5. De temps en temps nous obtenons une impasse quand la tentative expire pour verrouiller une rangée de table. Une sorte d'exception d'interblocage est lancée.Comment trouver les deux threads d'un interblocage?

L'exception est claire et la trace de pile indique ce qui s'est mal passé. Mais il ne montre pas l'autre thread qui détient le verrou réel. À moins que je sache ce que fait ce fil, c'est juste une aiguille dans une botte de foin.

QUESTION: Y a-t-il un moyen de trouver l'autre thread?

Merci!

Jan

+2

Où est l'exception venant de - mysql? Pouvez-vous poster une pile de pile? –

+0

Comment savez-vous que ce n'est qu'un autre thread? Il pourrait y avoir une longue chaîne de threads impliqués dans une impasse. –

+0

Je ne connais pas le nombre de threads impliqués bien sûr. Mais l'application est un cas typique "une demande = un fil". Nous ne faisons rien avec le filetage. Et puisque les verrous sont exclusifs, il ne peut y avoir qu'un seul thread à ce moment-là. –

Répondre

1

Essayez d'utiliser la commande suivante dans la prochaine fois que vous voyez MySQL dans une impasse. Cela devrait vous montrer la dernière impasse.

SHOW INNODB STATUS 

En général, lorsque vous voyez un blocage sur votre serveur d'applications les journaux montrent que le fil de la victime (celui qui a été annulée). Comme l'autre thread est terminé, aucune exception n'est levée. Vous devez retourner à votre base de données pour recréer les transactions.

Une fois que votre base de données a été capturée pour déterminer l'emplacement du blocage, vous pouvez poursuivre l'analyse.

+0

Cela ne va pas fonctionner parce que je n'ai pas accès à la base de données (c'est seulement sur la production bien sûr). Et même si je le pouvais, je ne serais pas capable de revenir assez vite au code Java derrière les différents objets verrouillés. J'ai vraiment besoin de trouver l'autre thread dans la JVM immédiatement après que l'exception soit levée. –

+0

quiconque admins votre base de données de production devrait être en mesure de recueillir les informations requises pour vous. Savoir quelles deux transactions java sont verrouillées est normalement inutile. Vous devez voir ce qui se passe dans votre base de données pour cela. Cela vous indiquera où dans la transaction votre verrou s'est passé, s'il était dans un index, une clé primaire etc. Il y a beaucoup à gagner en accédant à ce journal – Sean

+1

Cela ne devrait pas être: SHOW ENGINE INNODB STATUS ? –

0

Vous ne savez pas si vous l'avez déjà compris, mais si c'est une impasse, le vidage de fil serait d'une grande aide ici. Selon le système d'exploitation de l'application et vos privilèges d'accès, vous pouvez le générer de plusieurs façons.

  • sur * nix envoyer le signal QUIT au processus ('kill -3 pid) ferait le travail
  • utilisant jconsole/jvisualvm a une option pour obtenir
  • utilisant jstack standard jdk (prendre en considération - F les options -l) fera l'affaire
  • si vous avez la chance d'être sur solaris pstack vous aidera beaucoup

une fois que vous l'avez, ANALYZE verrouillé/threads en attente de trouver une impasse. Vous pouvez le faire manuellement ou en utilisant certains analyseurs existants qui utilisent des algorithmes de détection d'interblocage. Btw jvm a un builtin et il peut vous donner l'idée juste dans le vidage du fil.

Si je peux aider plus, faites le moi savoir.

bonne chance.

salutations, baz

0

si c'est un problème de code, vous pouvez essayer de se connecter au processus en cours d'exécution à l'aide jconsole et détecter l'impasse.

0

Si vous avez besoin de trouver le thread qui contient un verrou, vous pouvez le faire dans Eclipse via la vue de débogage. Jetez un oeil à http://archive.eclipse.org/eclipse/downloads/drops/R-3.1-200506271435/eclipse-news-part2b.html et faites défiler jusqu'à 'Déboguer les verrous et les blocages'.

Les serrures appartenant à un fil, ainsi que le verrouillage d'un thread attend peut à la fois être affiché en ligne dans la vue de débogage en activant l'option Afficher les moniteurs dans la vue de débogage menu déroulant. Les threads et verrous impliqués dans une impasse sont surlignés en rouge.

alt text