domingo, septiembre 09, 2007

Configurar el pool de datos de Tomcat

En varias ocasiones he tenido problemas a la hora de configurar una aplicación para que utilizase el pool de conexiones de un servidor de aplicaciones (normalmente Tomcat). Por ello, voy a exponer los pasos que se deben dar para poder usar esta característica.

El primer paso es configurar adecuadamente el contexto. El contexto (siempre hablando de Tomcat) se puede configurar de varios modos. El primero (nada aconsejable) es editar el fichero sever.xml e insertar el elemento <context></context> dentro de <host>. No es el mejor método, ya que no siempre vamos a tener acceso a ese fichero... además de la necesidad de parar el servidor para que los cambios surtan efecto.

Yo uso otro método. Antes de crear el fichero war con la aplicación, creo un fichero llamado context.xml dentro de una carpeta META-INF. En este fichero pongo lo siguiente:

<context path="/nombreAplicacion">
<resource auth="Container"
driverclassname="com.mysql.jdbc.Driver"
maxactive="100"
maxidle="30"
maxwait="10000"
name="jdbc/NombreAplicacionDS"
password="password"
type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/aplicacionBBDD?autoReconnect=true"
username="user">
</resource>
</context>

Como puedes ver, declaro un nuevo recurso para la aplicación llamado "jdbc/NombreAplicacionDS". Este nombre es muy importante, ya que ahora lo usaré como referencia web.xml. Ahora en el fichero web.xml, añado un elemento nuevo (asegurate de cumplir con el orden dentro de los elementos) dentro del elemento web-app:

<resource-ref>
<res-ref-name>jdbc/NombreAplicacionDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

Una vez incluido este elemento, ya sólo queda usarlo desde el código:

Context contexto = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(
"java:comp/env/jdbc/NombreAplicacionDS");
if (ds != null) {
Connection conexion = ds.getConnection();
}

Cuidado al crear la cadena para el lookup, si lo haces mediante variables (recomendable), la cadena debería ser "java:comp/env/" para que el ejemplo funcione.

Si ahora despliegas el war en un Tomcat (Ver. 5.5), verás como bajo la carpeta $HOME_TOMCAT$/conf/Catalina/localhost se habrá creado un fichero con extensión .xml y con el mismo nombre que nuestra aplicación. Si lo abres, verás el mismo contenido que introducimos en el fichero context.xml

Espero que os aproveche.

P.D.
Aseguraros que los drivers de la bb.dd. estén sólo en un único sitio. Este debe ser %TOMCAT_HOME%/common/lib. Si los tenéis en el lib del proyecto y en el lib del Tomcat (o cualquier otro sitio), fallará.

7 comentarios:

Anónimo dijo...

super aclarativo!! gracias de verdad!

Sunny dijo...

Muy interesante, bastante sencillo y creo que muy claro, gracias por el esfeurzo

uri dijo...

Hola!! En la parte que dice: 'NombreAplicacionDS' tengo que sustituirlo por el nombre de mi jsp o lo tengo que dejar asi tal cual?

Genis! dijo...

NO me sale T_T. Obtengo el DataSorce pero no tiene cargada la información. Lo tengo igualito a lo qe pones pero no furula.
o, si, te falto explicar por que hay que poner el "java:comp/env/".
Grache por ayudar.

Anónimo dijo...

Buenos días!!! Perdón x mi ignorancia, pero... donde debo poner esto?
Context contexto = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(
"java:comp/env/jdbc/NombreAplicacionDS");
if (ds != null) {
Connection conexion = ds.getConnection();
}

Anónimo dijo...

Hombre, pues "esto" es esencialmente, el código necesario para obtener una conexión... Debería estar en una clase a la que llamases cuando fuera necesario...

HS in my live...!! dijo...

He podido configurar y poner el pool de conexiones en produccion con tomcat6 gracias a esta ayuda....