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 !!!

18 comentarios:

Anónimo dijo...

Esta buena la guía

saludos

Daniel Morales Salas dijo...

que bueno que te haya gustado la guia y mejor aún si te ha servido de algo, apenas tenga tiempo completare con web service y web service client.

saludos!

Anónimo dijo...

Excelente y muy claro, gracias.

Alejandro dijo...

Excelente muy didáctico y completo, ¿podrias poner un ejemplo de como hacer un select y desplegar los datos en una pagina JSP??

Saludos..

Anónimo dijo...

Donde Puedo descargar el driver que une a mysql 5.0.45 con netbeans 5.5.1
NO Lo Se :S

jorge dijo...

HOlas, he estado usando el pool conection con oracle, Mysql y postgres todo junto, pero algo que me intriga es si debo hacer close a cada conexion despues de una operacion o el pool de glassfish se encarga de eso, les agradecere sus opiniones

Daniel Morales Salas dijo...

Cuando uno obtiene una conexion con el datasource, el servidor de aplicaciones se encarga de pasar una referencia a la conexion a la base de datos y cuando nosotros cerramos esa conexion (ctx.close()) lo que estamos haciendo es devolver la conexion al servidor de aplicaciones para que éste se la pase a otro cliente (objeto o lo que sea que lo requiera).

Fuente: http://java.sun.com/products/jndi/tutorial/ldap/connect/pool.html

saludos !!!

Zajnóstiko dijo...

Hola, me gustaría saber si tienes experiencia trabajando con Eclipse + JDNI + MySQL porque tengo esrios problemas para conectarme y he seguido las instrucciones de modificar el server.xml del Tomcat y el web.xml de mi Project.

Saludos.

Anónimo dijo...

Hola.

Antes que nada comentarte que muy bien los comentarios.

Me gustaría saber si hay alguna forma de crear varios connection pools. Tengo 12 bases de datos en mi proyecto y me gustaría crear uno para cada base de datos.
Alguien ha oido hablar de esto.??

Salu2

Daniel Morales Salas dijo...

Hola, de eclipse nada, no lo utilizo.

Si, con glassfish puedes tener muchos connection pool, asi que para tu caso especifico de 12 bases de datos no habria problema. Yo he probado teniendo varios connection pool a distintas bases de datos y cero drama hasta ahora.

saludos !!

Upernikao dijo...

Esta muy interesante la guia, pero quisiera saber si la base que se crea con derby es portable o como la puedo extraer del archivo. Quisiera que me ayuden con eso pues no se como hacerlo y me urge reaizorlo. Necesito repuesta lo mas pronto posible.

Anónimo dijo...

Excelente guía, muy bien explicada. Tengo una consulta. Estoy trabajando con un pool de conexiones que se pega a SQL Server. El pool trabaja muy bien, sin embargo deseo saber de que forma por medio de la página de Administración o por medio de comandos puedo eliminar las conexiones abiertas del pool, que por alguna circunstancia hayan quedado abiertas para liberarlas. Esto por supuesto, sin necesidad de reiniciar el servidor. Gracias de antemano....

Anónimo dijo...

Solo tengo una duda, estoy usando Net Beans 6 y ya tengo todo configurado, pero cada vez que llamo al metodo getConnection del datasource, el servidor abre un nuevo pool y no lo cierra asi yo le diga close().


Gracias por la ayuda

Anónimo dijo...

impresionante la guía, clara, didactica y directa al grano. no suelo postear demasiado, pero sólo me queda decir, gracias.

(se nota que llevo horas desesperado buscando algo así? XD)

Rafael Hernampérez dijo...

La guía me ha parecido de lo más interesante y didáctica que se haya escrito sobre el tema. He seguido todos los pasos hasta el momento de registrar el recurso en "Server Resources". En este punto no me aparece el recurso. Unicamente aparece el fichero xml y su contenido. Utilizo Netbeans 6.7.1. He repasado todos los puntos anteriores y están OK. Pero en este punto, no aparece el recurso para registrarlo. He probado a salir de NEtbeans y volver a entrar, por si era un problema de refresco, pero sigue ahí. ¿Alguna idea?

Anónimo dijo...

Hola:

Excelente articulo!!!!
FI LE TE!

Anónimo dijo...

Exelente te lo agradesco

Anónimo dijo...

hola profe.
te quiero pedir tu asesoria para conectar base de datos de sqlserver 2005 en netbeans 7.0.¿Me puedes guiar para hacerlo la conexion?
Gracias de antemano
Saludos Jack Johnes

Publicar un comentario en la entrada