
Leading the Way: Payara Platform Community 7 Beta Now Fully Jakarta EE 11 Certified
We’re excited to announce that Payara Platform Community 7 Beta application server is now fully certified as Jakarta EE 11 […]
En este articulo vamos a realizar una introducción general a los pools de conexiones y las mejores practicas de configuración para Payara Server.
Qué es un pool de conexiones?
Un pool de conexiones es un almacén de conexiones de bases de datos relacionales que se pueden utilizar y, más importante, reutilizar para conectar a una base de datos relacional.
See here for the original version in English language.
Las conexiones a bases de datos suelen ser caras en su creación y mantenimiento. Esto se debe generalmente al esfuerzo que el servidor debe realizar para:
Ahora, si tienes una aplicación web con sólo un usuario puedes simplemente crear una conexión a la base de datos al comienzo de la sesión de usuario y cerrarla al final de esta. Sin embargo, este es un escenario altamente improbable.
Ahora, imagina un escenario más realista donde tu aplicación web va a ser accedida por cientos o miles de usuarios. Si cada sesión de usuario crea una conexión a la base de datos, tus usuarios experimentarán un retardo mientras esa conexión se configura y el funcionamiento general de tu sistema se deteriorará.
Entonces, la respuesta a la pregunta sobre porque son necesarios los pools de conexiones, es porque mejoran tanto el rendimiento como la escalabilidad de tu sistema.
En lugar de crear nuevas conexiones cada vez que una es requerida, un pool de conexiones se crea cuando el servidor de aplicaciones es puesto en marcha. Estas conexiones se pueden utilizar y reutilizar cuantas veces sea necesario. Cuando una nueva conexión se necesita se busca una conexión disponible en el pool de conexiones. Si hay una disponible se devuelve al solicitante. En caso contrario, el pool crea una nueva conexión en caso de que haya conexiones disponibles de acuerdo a su configuración; de no ser así, la solicitud quedará encolada hasta que haya conexiones disponibles. Una vez que se ha terminado con la conexión, en lugar de cerrarla se devuelve al pool de conexiones para ser utilizada para un nuevo solicitante.
De acuerdo, esta es la teoría, pero, como funciona en la práctica?
Para esta demostración práctica los siguientes elementos serán utilizados:
Si estas utilizando diferentes versiones de estos elementos, los resultados pueden variar.
Primero, extraer los ficheros zip del JDK y Payara Server en un directorio de tu elección. Para el propósito de esta demo los he instalado en mi directorio de inicio:
/home/andy
Por conveniencia añade los directorios bin de Java y Payara Server al PATH y establece la variable de entorno JAVA_HOME al directorio donde has descomprimido Java.
En mi máquina están configuradas de la siguiente manera:
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/andy/jdk1.7.0_05/bin:/home/andy/payara41/bin
JAVA_HOME=/home/andy/jdk1.7.0_05
Lo primero, es arrancar una instancia Payara Server. Esto se puede hacer desde una terminal de línea de comandos con el siguiente comando:
asadmin start-domain
Una vez que está arrancado puedes acceder a la consola en http://localhost:4848
En el panel izquierdo seleccionar Resources – JDBC – JDBC Connection Pools
Haz click en New e introducir los siguientes valores:
Haz click en Next y después en Finish en la siguiente pantalla, aceptando los valores por defecto.
Añade las propiedades mostradas en la siguiente imagen al pool de conexiones entrando en la pestaña de propiedades adicionales del pool de conexiones.
Haz click en el nombre del pool de conexiones (test-pool).
Haz click en el botón Ping en la parte superior de la pantalla.
Deberías ver un mensaje indicando que el ping ha tenido éxito (Ping Succeeded).
También puedes crear un pool de conexiones utilizando la herramienta de línea de comandos asadmin como se muestra a continuación, sustituyendo tu password por la de test:
asadmin create-jdbc-connection-pool --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource --restype javax.sql.DataSource --property user=root:password=test:DatabaseName=test:ServerName=localhost:port=3306 test-pool
Para probar la conexión desde la línea de comandos ejecuta el siguiente comando:
De acuerdo, ahora que tenemos creado el pool de conexiones vamos a ver algunas buenas prácticas respecto a como configurarlo.
Los pools de conexiones deben ser dimensionados de forma apropiada para atender al máximo número de conexiones concurrentes.
El tamaño máximo debe establecerse en concordancia con el número máximo de peticiones de clientes que tu sistema puede procesar. Si tu aplicación recibe 100 peticiones y cada una de ellas requiere una conexión a base de datos, si tu pool de conexiones es menor que 100, algunas de esas peticiones tendrán que esperar a que una nueva conexión esté disponible.
El tamaño mínimo de un pool de conexiones asegura que el número más pequeño de conexiones a la base de datos siempre se establece al iniciar el servidor, esto quiere decir que si tienes un pool con un tamaño mínimo de 10 y recibes 10 peticiones, entonces todas pueden recuperar una conexión a la base de datos sin esperar a que el pool cree una nueva conexión.
Siempre hay una compensación al configurar estos valores, ya que el valor mínimo requiere que dichas conexiones se mantengan activas a pesar de la carga del sistema, mientras que el valor máximo puede requerir un potencial número alto de conexiones concurrentes a la base de datos.
Estos valores serán diferentes para todos los casos. No hay números mágicos por lo que es necesario que entiendas tu aplicación, cuál será carga esperada, tanto en escenarios estables como en el peor escenario, monitorizando detectar cambios en ésta y configurar los valores de la manera adecuada.
Haz click en el nombre del pool de conexiones y bajo Pool Settings encontrarás Initial and Minimum Pool Size and Maximum Pool size. Establecelos a los tamaños que necesites.
Para establecer el tamaño inicial y mínimo del pool
asadmin set resources.jdbc-connection-pool.test-pool.steady-pool-size=10
Para establecer el tamaño máximo del pool
asadmin set resources.jdbc-connection-pool.test-pool.max-pool-size=200
asadmin set resources.jdbc-connection-pool.test-pool.connection-validation-method=custom-validation
asadmin set resources.jdbc-connection-pool.test-pool.validation-classname= org.glassfish.api.jdbc.validation.DerbyConnectionValidation
asadmin set resources.jdbc-connection-pool.test-pool.is-connection-validation-required=true
También puedes configurar si cerrar todas las conexiones en caso de fallo con el siguiente comando:
asadmin set resources.jdbc-connection-pool.test-pool.fail-all-connections=true
La detección de fugas de sentencias y conexiones no cerradas te permite establecer tiempos de espera para que en el evento de que una sentencia SQL o una conexión no haya sido cerrada por una aplicación, el evento pueda ser registrado y/o estas sean cerradas de forma automática.
En un entorno de pruebas recomendaría hacer uso de esta funcionalidad para registrar las fugas detectadas pero NO cerrarlas de forma automática. Sin embargo, en producción recomendaría que las fugas sean cerradas. Si has probado lo suficiente no debería haber ninguna, pero si hay no quieres dejar fugas abiertas. Un software de monitorización debe ser configurado para alertar todas las fugas detectadas para que una investigación profunda pueda ser llevada a cabo de forma que se puedan aplicar las correcciones necesarias.
Por defecto estos valores están configurados a 0 por lo que a detección está apagada.
Hacer click en el nombre del pool, seleccionar la pestaña Advanced,
asadmin set resources.jdbc-connection-pool.test-pool.statement-leak-timeout-in-seconds=5
asadmin set resources.jdbc-connection-pool.test-pool.connection-leak-timeout-in-seconds=5
WARNING: A potential connection leak detected for connection pool test-pool. The stack trace of the thread is provided below:
WARNING: A potential statement leak detected for connection pool test-pool. The stack trace of the thread is provided below:
See the English language version here.
Share:
We’re excited to announce that Payara Platform Community 7 Beta application server is now fully certified as Jakarta EE 11 […]
Enterprise Java applications power global commerce, healthcare, government and countless other industries. These systems must be scalable, secure and […]
May 2025 marks a monumental milestone in software development: Java turns 30. The impact of this language on the […]