Resolución de problemas de puntos muertos de JPA y tiempos de espera excedidos de transacción
Los puntos muertos de base de datos y los tiempos de espera excedidos de transacción son el resultado de la contención entre dos o más clientes que intentan acceder al mismo recurso de base de datos. El punto muerto es un caso especial en el que se da una condición de bloqueo circular entre dos o más clientes, cada uno bloqueado por los demás, donde nadie puede continuar. Normalmente estos fenómenos no son errores de programación. Los provoca la lógica empresarial por el acceso a recursos de base de datos de forma compleja e interdependiente.
Acerca de esta tarea
Utilizando las mejores prácticas y estrategias siguientes, pueden minimizarse estas condiciones.
Procedimiento
- Identifique los recursos de base de datos afectados que han causado el error.
- Examine las excepciones (si las hay) cuando se produce el error, puesto que pueden ofrecer pistas sobre entidades fallidas que causaron la condición anómala.
- Si se utiliza el proveedor JPA predeterminado WebSphere Application Server, puede habilitar el grupo de rastreo “eclipselink.logging.level.sql” para aplicaciones EclipseLink o "openjpa.jdbc.SQL=all" para aplicaciones OpenJPA para recopilar las sentencias SQL y la información de hebra de los recursos de base de datos que están en cuestión. Clasificando la información, puede encontrar qué clientes y entidades son los artefactos han provocado la condición de error.
- Para un caso de uso más complejo, puede consultar la documentación de la base de datos para cualquier herramienta especializada o técnicas que puedan ayudarle a identificar los objetos y transacciones que causan los problemas de contención de datos.
- Cuando se hayan identificado los problemas, examine la lógica empresarial que
utiliza estos recursos para determinar que su uso no causa ninguna contención
prolongada. No hay una solución recomendada para resolver problemas de bloqueo y tiempo de
espera excedido. Depende en gran medida de la complejidad de la lógica empresarial y
las relaciones de las entidades. El concepto básico para resolver puntos muertos y
tiempos de espera excedidos es minimizar el tiempo de los recursos retenidos más de lo
que se debe y permitir a otros clientes acceder al mismo recurso. Si la contención
es inevitable, la aplicación debe establecer medios para la recuperación cuando
estas condiciones se produzcan. Estas son estrategias que pueden
ayudarle a minimizar las condiciones de problema, determine si puede aplicar una o
varias para resolver el problema:
- Asegúrese de que la lógica empresarial no bloquee las entidades más de lo que debe. Una aplicación JPA que sea principalmente de sólo lectura debe utilizar la semántica de bloqueo optimista que ofrece JPA de forma predeterminada. JPA 2.0 presenta funciones de bloqueo pesimista que permiten que las aplicaciones bloqueen explícitamente la entidad de forma pesimista a demanda. Debe optimizar el número de bloqueos pesimistas que se apliquen cada vez. Un exceso de bloqueo aumenta la probabilidad de puntos muertos y tiempos de espera, y disminuye la simultaneidad de aplicaciones y el rendimiento.
- Evite establecer un nivel de aislamiento de la conexión del origen de datos más restrictivo que el necesario. El nivel de aislamiento tiene el mismo efecto que la semántica de bloqueo pesimista en el nivel de conexión. JPA requiere el nivel de aislamiento de "read-committed" mínimo para alcanzar el objetivo de integridad básica de los datos. El nivel de aislamiento predeterminado del gestor de conexiones de WebSphere Application Server es específico de la base de datos. Consulte el tema sobre interfaces de programación para obtener información sobre la especificación de API JDBCConnectionSpec.
- Minimice la duración de cualquier transacción activa. Una transacción activa prolongada tiene el potencial de retener recursos que necesitan otros clientes. Confirme cualquier transacción en cuanto haya completado todos sus recursos.
- Optimice la lógica empresarial para evitar interdependencias de entidades. Si dos conjuntos de lógica empresarial utilizan recursos similares, considere actualizar los recursos en el mismo orden para anular la dependencia circular clásica de punto muerto. Esto depende del nivel de aislamiento que se esté utilizando. Tiene el mismo efecto que aplicar un bloqueo implícito a los recursos como se describe en la próxima estrategia.
- Utilice un bloqueo pesimista para sincronizar el acceso simultáneo al recurso común. Cuando las estrategias anteriores no se apliquen a su situación, el bloqueo pesimista es una alternativa para sincronizar el acceso a los recursos comunes utilizados por los distintos clientes simultáneos. La aplicación puede utilizar las funciones de bloqueo pesimista de JPA 2.0 para impedir que otros clientes accedan al recurso común hasta que la transacción se confirme o se retrotraiga. Un aumento del uso del bloqueo pesimista puede afectar a la simultaneidad y el rendimiento. El intento de acceso JPA de WebSphere Application Server también proporciona otra alternativa para buscar recursos de datos basados en la invocación de EJB o del nombre de tarea definido por el usuario.
- Realice una gestión y recuperación del punto muerto y la excepción de tiempo de espera excedido. La mayoría de servidores de bases de datos tienen un mecanismo de prevención de puntos muertos incorporado. Cuando detecta una condición de punto muerto, la estrategia típica que utiliza la base de datos es cancelar una de las peticiones y dejar que la otra progrese. Sin embargo, la petición que se termina es específica de la base de datos y no determinista. Si una aplicación lo permite, es una buena práctica para recuperar la condición de punto muerto y volver a intentar la operación.
Conceptos relacionados:
Tareas relacionadas:
Referencia relacionada:


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_jpadeadlock
File name: tejb_jpadeadlock.html