Glassfish: Pool de conexiones con PostgreSQL desde NetBeans


Hace poco estuve trabajando con un pequeño sistema web con Java y JSP el cual tenia clases que accedían a la base de datos a través de una conexión directa, entonces el sistema creció y me vi en la necesidad de poder utilizar una pool de conexiones para poder mejorar el acceso en rendimiento y tiempo de respuesta a la base de datos. Como siempre he mencionado en en este blog no pretendo darles a conocer la parte teórica dado que eso lo podemos encontrar en la
Wiki o en otras paginas con un mayor detalle, así que iremos directamente al trabajo práctico.

Entonces lo primero que debemos tener es configurado un gestor de base de datos con la respectiva base de datos creada la cual usaremos para realizar la conexión, en este caso PostgreSQL con la base de datos llamada bd_pool.

Una vez creada y configurada nuestra base de datos, lo que haremos ahora sera abrir nuestro NetBeans y poder registrar nuestro driver de conexión JDBC para PostgreSQL y luego crear la conexión que nos servirá de referencia para mas adelante. Entonces para esto dentro de NetBeans nos ubicamos en la pestaña de «services» (o servicios) y desplegamos la opción de «Databases» segun como se muestra en la imagen:

Luego le damos click derecho a «Drivers» y seleccionamos la opción «New Driver» entonces nos aparecerá una ventana en donde seleccionaremos la opcion «Add» y ubicamos el driver de conexión, en mi caso yo tengo el «postgresql-8.2-505.jdbc3.jar» quedando algo como esto:

Entonces solo le damos OK y ya tendremos el driver JDBC registrado y listo para usarse., segun como se muestra en la imagen:

Ahora lo que nos tocaría hacer es crear la conexión que nos servirá de referencia para poder crear el pool de conexiones, entonces en la lista mostrada anteriormente, le damos click derecho a PostgreSQL y seleccionamos la opcion «Connect Ussing» y nos aparecera una ventana en la cual llenaremos todos los datos requeridos, quedando algo como esto:

Le damos OK y luego nos aparecerá una ventana en donde seleccionaremos el esquema, entonces debido a que nosotros estamos utilizando el esquema por defecto entonces desplegamos el combo y seleccionamos «public» y luego veríamos la referencia de conexión dentro de la lista como se muestra en la imagen:

Bueno ya tenemos la primera parte de este proceso terminado, ahora continuaremos creando una aplicación web a la que llamaremos WebAppPool, solo para temas didácticos; creo que ya sabemos como hacerlo, así que no entrare en detalle allí.

Entonces una vez creado el proyecto web, le damos click derecho y nos ubicamos en «New» y luego seleccionamos la opción «Other..» y luego dentro de la opciones  nos ubicamos en «Glassfish«, quedando de esta manera:

Entonces una vez aquí haremos dos procesos, el primero sera seleccionar la opción «JDBC Connection Pool», luego click en «Next» y en la siguiente ventana colocaremos como nombre «PoolDemo» y en la relación de conexiones existentes, seleccionamos la conexión activa que habíamos registrando anteriormente tal como se muestra en la figura:

luego le damos click en «Next» y obtendremos una ventana con el detalle de la conexión, tal como la URL, el usuario y el password, pero necesitaremos agregar mas detalle; para esto haremos click en el botón «Add» e iremos agregando el «servername», «database» y «portnumber» tal como se muestra en la figura:

y luego para terminar esta parte le damos click en «Next» y nos mostrara una ventana con varias opciones de configuración, para lo cual solo cambiaremos la opción de «Steady Pool Size» que no es mas que el numero de conexiones que tendrá nuestro pool, en este caso lo cambiare de 8 a 5; pero hago la aclaracion que esto dependera de cada usuario, puede tener hasta mas conexiones, y luego finalizamos.

Esto nos generara un archivo con extensión *.xml y que estará ubicado dentro del directorio «Server Resources» con el nombre «sun-resources.xml» el cual debería contener lo siguiente:

«sun-resources.xml»

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.postgresql.ds.PGSimpleDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="PoolDemo" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="URL" value="jdbc:postgresql://localhost:5432/bd_pool"/>
    <property name="User" value="postgres"/>
    <property name="Password" value="mipassword"/>
    <property name="serverName" value="localhost"/>
    <property name="databaseName" value="bd_pool"/>
    <property name="portNumber" value="5432"/>
  </jdbc-connection-pool>
</resources>

luego nos quedaría agregar el recurso o referencia que utilizara el pool para ser llamado desde una clase que necesite la conexión, para esto le damos click derecho al proyecto, seleccionamos «New» y dentro de la ventana de opciones seleccionamos «Glassfish« y luego seleccionamos la opción «JDBC Resourcce» le damos click en «Next» y nos aparecera una ventana en donde seleccionaremos el pool creado anteriormente y en la opcion «JNDI Name» colocaremos como nombre «jdbc/pooldemo» quedando de la siguiente manera:

y luego finalizamos. Ahora en el archivo «sun-resources.xml» tendremos lo siguiente:

«sun-resources.xml»

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
  <jdbc-resource enabled="true" jndi-name="jdbc/pooldemo" object-type="user" pool-name="PoolDemo">
    <description/>
  </jdbc-resource>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.postgresql.ds.PGSimpleDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="PoolDemo" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="URL" value="jdbc:postgresql://localhost:5432/bd_pool"/>
    <property name="User" value="postgres"/>
    <property name="Password" value="mipassword"/>
    <property name="serverName" value="localhost"/>
    <property name="databaseName" value="bd_pool"/>
    <property name="portNumber" value="5432"/>
  </jdbc-connection-pool>
</resources>

Y ya con esto tenemos la configuración lista para ser desplegada en el servidor para luego poder ser usado desde una clase u otro aplicativo que necesite una conexión.

Entonce ahora le damos clic derecho a nuestra aplicación web y seleccionamos «deploy», con esto estaremos generando el pool de conexiones y nombre de recurso asignado a ese pool en nuestro servidor de aplicaciones. Esto lo podemos verificar entrando a la consola de administración de Glassfish; una vez dentro nos ubicamos en la opción Recursos, luego en JDBC y luego para ver nuestro pool creado nos ubicamos en Conjunto de Conexiones, y luego dentro de la lista debería estar «PoolDemo», lo seleccionamos y nos ubicamos en la parte derecha del detalle y hacemos clic en «Sondeo», si todo marcha bien deberías tener lo siguiente:

y luego para verificar si nuestro recurso se creo nos ubicamos en «Recursos JDBC» y en la lista debemos tener «jdbc/pooldemo», tal como se muestra en la figura:

Y listo prácticamente eso seria todo con referencia a este tutorial, lo único que faltaría es llamarlo desde una clase cualquiera, cosa que «posteare» mas adelante. Trate de ser lo mas didáctico posible, espero les sirva.

18 comentarios en “Glassfish: Pool de conexiones con PostgreSQL desde NetBeans

  1. Dejame felicitarte porque es el unico tutorial decente que encontre para realizar pool de conexiones con postgresql y glassfish, buen trabajo.

    PD:Por favor no coloques «deployada», es desplegada en el buen castellano jeje. La verdad es que se ve un poco feo ese extranjerismo ahi jeje.

  2. Hola disculpa la molestia pero si me podrias informar como puedo hacer una conexion a POstgres pero en una aplicacion normal java en NetBeans. Osea no quiero la conexion para una aplicacion Web..
    Poe favor si me pueden ayudar con eso…

  3. Disculpa si podrias hacer un blog con un ejemplo con la conexion a postgres desde NetBeans en una aplicacion java, pero no AplicacionWeb.
    Tambien quiero saber como desplego datos de la base de datos en un grid o algo por el estilo.
    Por gavor ayudenme…. Mil gracias

  4. Hola Brando.. muchas gracias por tu ayuda..
    Estoy testeando en glassfish 3 domain, y con el ejemplo que me comentaste no se dejaba, lo curioso del caso es que el unico problema que tenia era

    c.lookup(«java:comp/env/jdbc/aqui_iria_el_nombre_del_recurso_jdbc»);

    No me lo reconocia, entocnes use
    c.lookup(«jdbc/aqui_iria_el_nombre_del_recurso_jdbc»);

    Y creeras que asi si lo reconocio..
    SALUDOS

    • Hola Fernando, mira que esto si es interesante, disculpame se me olvido especificar la version de glassfish, que en este caso es la 2.x, posiblemente en la version 3 ya no sea necesario agregar toda la ruta. Definitivamente tendre que probarla de esa manera.

      Gracias por la aclaración

      Saludos.

  5. Gracias por la info. tengo un problema, en el paso en el que se ingresa al glassfish para validar el pool de conexión, le doy ping y me da este error: «Fallo al hacer ping al pool de conexiones para conexion. Connection could not be allocated because: FATAL: no existe la base de datos �null� Please check the server.log for more details. » que puedo hacer??

Replica a ALVARO CAMPO Cancelar la respuesta