java - traer - llenar un jtable con datos de una base de datos mysql
¿Cómo configurar la conmutación por error de conexión para una configuración PostgreSQL Hot Standby en una aplicación JavaEE? (1)
Tengo dos servidores Linux ( A
y B
) con una PostgreSQL 9.5
datos PostgreSQL 9.5
instalada. Configuré el modo de espera activa como se describe en la documentation . En esta configuración, A
está configurado como maestro, B
en el modo de espera activa. Esto está funcionando bien y se comporta como se espera.
Ahora, quiero conectar una aplicación Java EE
independiente (que se ejecuta en una máquina diferente) a través de Hibernate
/ JDBC
través de una TomEE
datos TomEE
a esta configuración de base de datos.
La documentación del controlador PostgreSQL indica que se pueden especificar varios hosts en la url de conexión jdbc:
jdbc:postgresql://host1:port1,host2:port2/database
Así que mis preguntas son:
- Si
A
está abajo yB
se cambia manualmente al modo de operación normal, ¿mi aplicación aún puede continuar con la operación de la base de datos con una url de conexión jdbc como se indicó anteriormente? - ¿Tengo que configurar otros parámetros / bibliotecas?
Nota: de varias fuentes aprendí que PostgreSQL
no admite la conmutación por error automática (a menos que el software de terceros esté involucrado en el proceso; consulte los comentarios a continuación). Por este motivo, la conmutación por error debe realizarse de forma manual, lo cual está bien para este caso de uso en particular.
EDIT-1:
Decidí probar pgBouncer
(como se sugiere en los comentarios) para una solución. Funciona bien para mi caso de uso. Escribí un script de vigilancia, que automatiza los pasos manuales:
- Compruebe continuamente si
A
sigue vivo y escucha las conexiones entrantes. - En caso de conmutación por error, cambie
B
al modo de funcionamiento normal y deje que se convierta en el nuevo maestro y reinicie el servicio. - Cambie la configuración de
pgBouncer
para que apunte aB
lugar deA
y reinicie el servicio.
Sin embargo, todavía estaría interesado, si alguien tiene experiencias sin software de terceros.
En este tipo de situaciones, probablemente es mejor probar y medir.
No tengo experiencia práctica con el modo Hot Standby de PostrgeSQL, pero he realizado la conmutación por error de la base de datos para una aplicación Java.
Primero, pruebe las afirmaciones en la página de documentación del controlador PostgreSQL sobre el ?targetServerType=master
(mencionado en la parte inferior de la página).
Escriba una pequeña clase de Java "PgHsm" con un método principal que use el controlador JDBC de PostgreSQL a través de DriverManager.getConnection
y ejecute una consulta de actualización simple.
Debe usar el servidor A para hacer la consulta de actualización. Detenga PostgreSQL en el servidor A, ejecute PgHsm: debería fallar al conectarse ya que el servidor B no es un maestro.
Haga que el servidor B sea el maestro, ejecute PgHsm: debería funcionar correctamente.
El origen de datos está respaldado por un grupo de conexión de base de datos en TomEE. Esta página enumera las disponibles en TomEE. Pero no todos los grupos de conexión de bases de datos son iguales y ahora prefiero HikariCP porque, en mi experiencia, maneja el escenario de "base de datos inactiva" de manera más predecible. Vea también la prueba con resultados en la página de base de datos de manejo de HikariCP.
Desafortunadamente, HikariCP usa get/setNetworkTimeout
JDBC para comportarse de manera predecible y el controlador JDBC de PostgreSQL no implementa esto (*). Por lo tanto, para asegurarse de que los subprocesos de la aplicación (JavaEE) no se cuelguen para siempre en una acción de base de datos, debe configurar las opciones del controlador JDBC connectTimeout
y socketTimeout
. Establecer un socketTimeout
es precario, ya que establece automáticamente un límite de tiempo para TODAS las consultas a la base de datos.
(*) Actualización: desde la versión 42.2.x
se implemented tiempos de espera de la red.
La segunda prueba que se realiza consiste en actualizar la clase "PgHsm" de Java para usar la implementación del grupo de conexión de base de datos de su elección e iniciar (al menos) dos subprocesos que continuamente ejecutan consultas de actualización simples en un bucle (en el bucle se adquiere una conexión de base de datos la agrupación y volvió a la agrupación después de confirmar / deshacer). Mientras baja el servidor A y cambia el servidor B al modo "maestro", supervise las excepciones registradas por "PgHsm" y el tiempo que un hilo espera / se bloquea al realizar una acción de la base de datos.
Los resultados de las pruebas se pueden utilizar para actualizar las opciones del controlador JDBC y la configuración de la agrupación. Centrarse en los resultados donde:
- Las conexiones inválidas se eliminan del grupo lo antes posible para que la aplicación obtenga la mayoría de las conexiones válidas del grupo.
- el menor número posible de subprocesos de aplicaciones se cuelga (durante el menor tiempo posible) cuando una base de datos falla
La segunda prueba se basa en que el servidor A no está disponible, por lo que las consultas de prueba de conexión (realizadas por el conjunto de conexiones de la base de datos) fallan. En el caso de que ambos servidores permanezcan disponibles, pero el interruptor maestro y el esclavo, una consulta de prueba de conexión no ayudará y el grupo de conexiones de la base de datos proporcionará las conexiones de base de datos erróneas (ahora de solo lectura) a la aplicación. En ese caso, se requiere intervención manual. Aquí se describe un "patrón de conmutación por error" para HikariCP (solo disponible con la opción allowPoolSuspension
descrita en la página de configuration ):
- suspendPool ()
- softEvictConnections ()
- Espere hasta que activeConnections vaya a 0.
- resumePool ()
La tercera prueba será con la aplicación JavaEE y para este momento, debe tener una buena idea de los problemas que puede esperar. No es infrecuente que las aplicaciones se actualicen después de este tipo de pruebas para mejorar el manejo de los escenarios de "bases de datos inactivas" (por ejemplo, configuración (predeterminado) query-timeouts ). En su caso, también sería deseable una función de "suspender, vaciar y reanudar el conjunto de conexiones de base de datos" (el patrón descrito anteriormente) para usar durante la conmutación por error manual.