Pregunta

Estoy probando la tolerancia a fallos de un sistema de ActiveMQ configurado como JDBC maestro / esclavo. En esta configuración hay una base de datos PostgreSQL y dos corredores - uno es el agente principal, el otro es un corredor de esclavos. El funcionamiento de este mecanismo es el maestro lleva a cabo un bloqueo exclusivo en una tabla en el PP. El esclavo trata de hacer esto también, y espera hasta que la cerradura esté disponible. Si el maestro muere, el bloqueo debe ser liberado y el esclavo se hará cargo. Sin embargo, si el maestro pierde la conectividad de red con la base de datos, el bloqueo se libera no resulta en un escenario de estancamiento. Lo que parece ser requerido aquí es una manera de contar Postgres para liberar automáticamente el bloqueo si no se renueva en un plazo determinado de tiempo. La POSA 3 libro de patrones de diseño llama a esto el patrón de leasing. ¿Es posible obtener Postgres para hacer esto? Si no es así, apoyan otros proveedores de bases de datos que?

¿Fue útil?

Solución

Este problema de conexión no es un callejón sin salida, esta se ha perdido.

Un interbloqueo se produce cuando dos transacciones tratan de bloquear los recursos previamente bloqueados por la otra. PostgreSQL detecta estas situaciones.

En su caso, master encierra un recurso, espera slave para master, y espera master para la entrada del usuario, que nunca recibe porque se pierde la conexión.

Siempre que PostgreSQL detecta una conexión perdida, que Rollbacks su transacción automáticamente.

Para el control de detección de pérdida de conexión, puede utilizar el siguiente PostgreSQL conexión :

  

tcp_keepalives_idle (integer)

     

En los sistemas que soportan la opción de conector TCP_KEEPIDLE, especifica el número de segundos entre el envío de mensajes de actividad en una conexión de otro modo inactivo. Un valor de cero usa el sistema por defecto. Si no se admite TCP_KEEPIDLE, este parámetro debe ser cero. Este parámetro se ignora para las conexiones realizadas a través de un socket Unix-dominio.

     

tcp_keepalives_interval (integer)

     

En los sistemas que soportan la opción de conector TCP_KEEPINTVL, especifica cuánto tiempo, en segundos, para esperar una respuesta a un mantenimiento de conexión antes de retransmitir. Un valor de cero usa el sistema por defecto. Si no se admite TCP_KEEPINTVL, este parámetro debe ser cero. Este parámetro se ignora para las conexiones realizadas a través de un socket Unix-dominio.

     

tcp_keepalives_count (integer)

     

En los sistemas que soportan la opción de conector TCP_KEEPCNT, especifica cuántos mensajes de actividad puede perderse antes de considerar la conexión muertos. Un valor de cero usa el sistema por defecto. Si no se admite TCP_KEEPCNT, este parámetro debe ser cero. Este parámetro se ignora para las conexiones realizadas a través de un socket Unix-dominio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top