2010-09-13 10 views
5

Estamos teniendo la clásica pila spring/hibernate/mysql ejecutándose en Tomcat 5.5. De vez en cuando nos encontramos con un punto muerto cuando el intento agota el tiempo para bloquear una fila de la mesa. Se produce algún tipo de excepción de interbloqueo.¿Cómo encontrar AMBOS hilos de un punto muerto?

La excepción es clara y el seguimiento de la pila indica qué salió mal. Pero no muestra el otro hilo que sostiene el bloqueo real. A menos que sepa lo que está haciendo ese hilo, todo es solo una aguja en un pajar.

PREGUNTA: ¿Hay alguna manera de encontrar el otro hilo?

Gracias!

Ene

+2

¿Dónde está la excepción viene de - MySQL? ¿Puedes publicar una stacktrace? –

+0

¿Cómo sabes que es solo otro hilo más? Podría haber una larga cadena de hilos involucrados en un punto muerto. –

+0

No sé la cantidad de hilos involucrados, por supuesto. Pero la aplicación es un caso típico de "una solicitud = un hilo". No hacemos nada con el enhebrado. Y dado que los bloqueos son exclusivos, solo puede haber un hilo en ese momento. –

Respuesta

1

intente utilizar el siguiente comando en MySQL próxima vez que vea un punto muerto. Esto debería mostrar el último punto muerto.

SHOW INNODB STATUS 

Normalmente, cuando ves a un punto muerto en el servidor de aplicaciones los registros muestran sólo el hilo de la víctima (la que se deshace). Como el otro hilo ha terminado, no se lanza ninguna excepción. Debe volver a su DB para recrear las transacciones.

Una vez que tenga una captura de su DB para saber dónde se produjo el punto muerto, puede investigar más.

+0

Esto no va a funcionar porque no tengo acceso a la base de datos (está solo en producción, por supuesto). Y aunque pudiera, no sería capaz de retroceder lo suficientemente rápido como para el código de Java detrás de los diversos objetos bloqueados. Realmente necesito encontrar el otro hilo dentro de la JVM inmediatamente después de lanzar la excepción. –

+0

quien administre su base de datos de producción debería ser capaz de reunir la información requerida para usted. Saber qué dos transacciones de Java están bloqueando es normalmente inútil. Necesita ver lo que está sucediendo en su base de datos para esto. Esto le indicará en qué parte de la transacción se produjo el bloqueo, si estaba en un índice, clave principal, etc. Hay mucho que ganar al acceder a este registro – Sean

+1

¿No debería ser: 'MOSTRAR ESTADO DE INNODB DEL MOTOR' ? –

0

no estoy seguro de si ya lo ha descubierto, pero si se trata de un punto muerto, el volcado de hilo sería de gran ayuda aquí. Dependiendo de qué sistema operativo se ejecute la aplicación y de sus privilegios para acceder a ella, puede generarla de muchas maneras.

  • en el envío * SALIR señal al proceso de nix ('matar -3 pid') sería hacer el trabajo
  • utiliza jconsole/jvisualvm tiene una opción para conseguirlo
  • usando jstack JDK estándar (consideran - F opciones -l) hará el truco
  • si tienes la suerte de estar en Solaris pstack va a ayudar mucho

una vez que lo tienes, analizar bloqueado/subprocesos en espera de encontrar un punto muerto. Puede hacerlo manualmente o utilizando algunos analizadores existentes que utilizan algoritmos de detección de punto muerto. Btw jvm tiene una función integrada y puede darte la idea directamente en el volcado de subprocesos.

Si puedo ayudar más solo házmelo saber.

buena suerte.

cordiales, baz

0

si se trata de un problema de código que podría intentar conectarse con el proceso que se ejecuta utilizando jconsole y detectar el punto muerto.

0

Si necesita encontrar el hilo que contiene un bloqueo, puede hacerlo en Eclipse a través de la vista de depuración. Eche un vistazo al http://archive.eclipse.org/eclipse/downloads/drops/R-3.1-200506271435/eclipse-news-part2b.html y desplácese hacia abajo hasta "Bloqueos y bloqueos de depuración".

Las cerraduras propiedad de un hilo, así como el bloqueo de un hilo está esperando que se pueden mostrar en línea en la vista de depuración moviendo el Mostrar Monitores elemento de menú en el menú desplegable de vista de depuración. Los subprocesos y bloqueos implicados en un punto muerto se resaltan en rojo.

alt text

Cuestiones relacionadas