Pool de Conexiones
JDBC
Las conexiones a cualquier medio ( base de datos relacional, sistemas legacy, etc. ) son un recurso caro. Normalmente existe un nmero limitado de conexiones que puede mantener abiertas un determinado servidor, dependiendo de su memoria, su potencia, del sistema al que estamos accediendo, etc.
Conexiones a Bases de Datos con JDBC
Driver Manager
Programa
Cargar Driver Abrir conexin
Connection
Statement
ResultSet
Obtener objeto Statement Ejecutar sentencias Manejar resultados Cerrar objeto Statement Cerrar conexin
3
Pool de Conexiones
Muchos sistemas que actan como servidores necesitan mantener una gran escalabilidad y por lo tanto no pueden arriesgarse a que se agoten las conexiones. Qu se puede hacer?
Un pool de conexiones soluciona esta problemtica. Se trata de un conjunto limitado de conexiones que se reutilizan constantemente para dar servicio a los diferentes clientes. De este modo se aumenta la escalabilidad y tambin el rendimiento ya que no sera necesario abrir las conexiones constantemente.
Pool de Conexiones
Normalmente un pool de conexiones se inicializa con un nmero de conexiones determinado. Casi todos los servidores modernos traen normalmente pools de conexiones integrados. En un pool de conexiones cada una de estas es utilizada por mltiples clientes diferentes. Los clientes abren la conexin, acceden al servicio a travs de ella y por ltimo cierran dicha conexin. Es importante que el cliente abra y cierre la conexin en cada acceso al servicio ya que si no la cerrase no la estara devolviendo al pool y por lo tanto correramos el riesgo de agotar los recursos del servidor.
Pool de Conexiones El estado inicial de un Pool de conexiones consiste en crear las conexiones fsicas iniciales
Pool de Conexiones
Cuando un Objeto Java del Servidor Java EE requiere una conexin a travs del mtodo dataSource.getConnection(), la fuente de datos javax.sql.DataSource habla con el Pool de conexiones y ste le entrega una conexin lgica java.sql.Connection. Esta conexin lgica finalmente es recibida por el Objeto Java.
Pool de Conexiones
Pool de Conexiones
Cuando un Objeto Java del Servidor Java EE desea cerrar una conexin a travs del mtodo connection.close(), la fuente de datos javax.sql.DataSource habla con el Pool de conexiones y le devuelve la conexin lgica en cuestin.
Configuracin de context.xml
(Carpeta conf de Tomcat)
Configuracin de context.xml
<Resource name="jdbc/DBTest" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username=root" password="avantasia" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test"/>
Configuracin de server.xml
driverClassName. Nombre calificado de la clase Java del driver JDBC a utilizar
username. El usuario a pasar al driver JDBC para establecer la conexin. password. La contrasea pasar al driver JDBC para establecer la conexin. url. La URL a pasar al driver JDBC para establecer la conexin. initialSize. Nmero inicial de conexiones que crear el pool al arrancar. Por defecto es 0. No se recomienda inicializar este nmero muy elevado. maxActive. Nmero mximo de conexiones activas que puede albergar el pool al mismo tiempo, 0 si no se quiere limitar este nmero. El nmero ms alto que puede tener esta propiedad ser el nmero total de conexiones que permita nuestro repositorio de base de datos. maxIdle. Nmero mximo de conexiones activas que pueden permanecer en el pool en estado idle, sin contar las que estn siendo liberadas en ese momento, 0 si no se quiere limitar este nmero. minIdle. Nmero mnimo de conexiones activas que pueden permanecer en el pool en estado idle, sin contar las que estn siendo creadas en ese momento, 0 para no permitir ninguna.
Configuracin de webt.xml de la aplicacin
<resource-ref> <description>MySQL Connections</description> <res-ref-name>jdbc/Libreria</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
Uso del Pool
Nota: deben importarse los paquetes: javax.sql y javax.naming
Ventajas
Resultado de un anlisis realizado (www.adictosaltrabajo.com) Para el mismo intervalo de tiempo, un servlet, al usar del pool ha sido capaz de atender 30727 peticiones mientras que sin el pool apenas fue capaz de atender 630 peticiones. En media, el servlet, al usar el pool a logrado atender las peticiones en 1 milisegundo, mientras que sin el uso del pool este tiempo se incrementa a 79 milisegundos. El rendimiento del servlet, al usar el pool ha sido de 6138 peticiones por segundo, mientras que sin el Pool decrece drsticamente a 124 peticiones por segundo.