Connection pool y Datasource en NetBeans 5.5.1

domingo, 30 de septiembre de 2007
Muchas veces desarrollamos aplicaciones que se conectan a una o varias bases de datos (MySQL, Oracle, PostgreSQL, etc.) y el gran problema siempre es la cantidad de conexiones que deben soportar dichas bases de datos. Qué pasa si hay 4000 conexiones a la vez ? que pasa si esta cifra aumenta ? bueno, ya pueden imaginar que cosas podrian suceder, partiendo por que el servidor de base de datos se caiga ...

Pero para este gran problema existe una solución muy buena y viene en el uso de un DataSource mediante el cuál el cliente se conectará a la base de datos. Este datasource utiliza lo que se conoce como Connection Pool que no es mas que una cantidad de conexiones disponibles para el uso y lo maneja un servidor de aplicaciones (como glassfish). No entraré en detalles sobre como funciona de forma interna, por ahora nos basta decir que mediante un connection pool las conexiones a la base de datos pueden bajar de 4000 a solo 100 (esas son cifras reales), ya que no siempre se necesitan conexiones activas. Esto no quiere decir que un cliente se quedará sin el recurso, si no mas bien que el servidor de aplicaciones permitirá un mejor uso de dicho recurso a través de la gestión que hace al administrar el pool de conexiones.

Una vez un hombre que diseñó una arquitectura que Microsoft tomó como ejemplo (no recuerdo su nombre) nos dió una charla en la Universidad y comentó que el gran problema del Open Source era que si bien habia gran documentación era muy difícil encontrar ejemplos prácticos, lugares donde te dijeran cómo hacer las cosas mas que el qué hay que hacer. En ese punto le encontré la razón y uno de los fines de mi blog es justamente dar ejemplos prácticos de cómo hacer las cosas, pero fundamentando.

Bueno, manos a la obra ...

En resumen lo qué haremos será lo siguiente:
  1. Establecer una conexión con la base de datos.
  2. Crear una aplicación web.
  3. Crear un connection pool.
  4. Crear un datasource.
  5. Registrar el connection pool y el datasource en el servidor de aplicaciones.
  6. Llamar un datasource desde una clase en mi aplicacion web.
Lo primero es lo primero, necesitamos algunas cosas antes de partir. Necesitamos instalado:
(las versiones pueden variar, yo utilizé esas). Si se fijan, en el segundo enlace esta el NetBeans 5.5.1 y el JDK 1.6.0_02 en un solo paquete.

Una vez todo instalado debemos tener corriendo la base de datos.


Ahora crearemos una conexión a la base de datos usando netbeans, pinchen la pestaña "runtime", luego "Databases", click derecho a "Drivers" y pinchan "New driver"


Aquí debes pasarle el driver jdbc como pueden ver en la imagen, luego click en Ok.
Ahora vamos a crear una conexión utilizando el driver que le acabamos de pasar. Haz click derecho sobre "Databases" y pincha "New connection".


En la ventana que aparece ingresa los datos que corresponden como pueden ver en la imagen. Luego pincha Ok.


Ahora ya tenemos una conexión a la base de datos desde netbeans, la cual podremos usar cuando queramos en nuestras aplicaciones. Ahora levantaremos nuestro servidor de aplicaciones, para esto pincha sobre "Servers", haz click derecho sobre "Sun Java System Application Server 9" y pincha "Start", esto levantará el servicio que utilizaremos mas adelante.


Ahora crearemos un "Web Application" ...



Una vez creado el proyecto crearemos el connection pool, para esto haz click derecho sobre el proyecto, mueve el cursor a "New" y pincha "File/Folder".


Ahora busca a la derecha "Sun Resources" y a la izquierda pincha "JDBC connection pool" y luego siguiente.


Ahora debes colocar un nombre a tu connection pool y seleccionar la conexión a la base de datos que previamente estableciste en netbeans.


luego pinchas siguiente y verás los datos de la conexión a la base de datos, luego pinchas "finish".


Ahora vamos a crear el datasource, para esto vas donde mismo para crear el connection pool pero esta vez seleccionas "JDBC Resource".


luego pinchas siguiente y seleccionas el connection pool previamente creado, luego ingresa un nombre a tu datasource, puede ser cualquier nombre, pero no lo olvides, lo necesitarás mas adelante.


Ahora necesitamos crear una referencia al datasource en nuestro proyecto, para esto haz doble click en "web.xml" (está en MiProyecto -> Web pages -> WEB-INF), luego pinchas "References" -> "Add" y agregas el nombre que le pusiste al datasource.


luego pinchas Ok. Si pinchas "XML" en web.xml podrás ver que se agregó la referencia.


Ahora haz doble click sobre "sun-web.xml", expande "Sun Web Aplication" y pincha el datasource que aparece ahí (es el que tu creaste). Fijate que donde dice "JNDI Name" no hay nada, debes copiar y pegar lo que sale justo arribita (el nombre de tu datasource) y guardas.



Ahora debes registrar en el servidor de aplicaciones el connection pool y el datasource que haz creado previamente, simplemente expande "Server resources" en tu proyecto y haz click derecho sobre el connection pool y pincha "Register", lo mismo después con el datasource.


Ya tenemos listo el connection pool y el datasource en nuestra aplicación y en el servidor de aplicaciones. Ahora solo resta utilizarlos en nuestra aplicación. Para ésto haz una clase java en tu proyecto colocando el nombre que tu quieras.


Una vez creada haz click derecho en el editor de netbeans, sobre tu clase y mueve el cursor a "Enterprise resources" y pincha "Use database".


Luego selecciona el datasource que creaste y pinchas Ok.


Ahora podrás ver que en el editor de netbeans ha aparecido un método que obtiene y retorna un DataSource.


Ya con eso puedes crear un objeto de tipo Connection y conectarte a la base de datos usando el DataSource que retorna el metodo previamente creado.


Ahora ya estas listo para trabajar como comunmente lo haces utilizando un objeto de tipo PrepareStatement y ResultSet.

Si te fijas en tu aplicación en ninguna parte ingresas un nombre de base de datos ni usuario ni contraseña, ni si quiera cargas el driver jdbc, ésto es por que tu aplicación ya no es mas un cliente-servidor, agregaste una capa intermedia que es el servidor de aplicaciones, el cuál se encarga de manejar las conexiones a la base de datos, alivianando la carga sobre éste último.

Saludos !!!