Oscar's Blog

Blog de Oscar Valenzuela - GNU con Linux, Free Software, Android, Hacking

Pool de conexiones con Tomcat

17 Mar 2013


Una de las buenas prácticas que debemos tener presentes a la hora de desarrollar software es la abstracción de la capa de datos. Tomcat nos ayuda, al igual que otros servidores Java(EE), a manejar un pool de conexiones a las bases de datos.

¿Por qué manejar un Pool JDBC?

Dado las circunstancias, muchas veces los sistemas son migrados de servidores y probablemente hasta de base de datos, por lo que manejar un pool en el servidor te ahorra tiempo al momento de cambiar las credenciales y hasta el driver de conexión, de manera que no tengamos que cambiarlo en el código fuente.

La forma en la cual se efectúa esto no tiene mucha complejidad. Dentro de los archivos de configuración de Apache Tomcat en la carpeta conf/ está el fichero context.xml, al cual uno le agrega con el tag Resource la conexión a la DB.


<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->




WEB-INF/web.xml

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
maxActive="100" maxIdle="100" maxWait="10000" name="jdbc/test"
password="123456" type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/test" username="root" />

Agregué en el tag Resource los atributos:

  • auth=”Container” (tipo, en este caso es contenedor)
  • driverClassName=”com.mysql.jdbc.Driver” (driver a cargar por Tomcat)
  • maxActive=”100″ (máximo de conexiones activas, por defecto)
  • maxIdle=”100″ (máximo de conexiones, por defecto)
  • maxWait=”10000″ (máximo de tiempo en mili-segundos para la conexión, por defecto)
  • name=”jdbc/test” (el nombre del contenedor)
  • password=”123456″ (contraseña de la base de datos)
  • type=”javax.sql.DataSource” (señala datasource para la conexión)
  • url=”jdbc:mysql://localhost:3306/test” (url de la base de datos)
  • username=”root” (usuario de la base de datos)

</ul>

Para mayor información sobre las posibles configuraciones puedes revisar la documentación de Tomcat en http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

Es importante también tener en cuenta la ubicación del driver jdbc, este puede ser puesto tanto en la carpeta lib/ del server, o bien puedes incluirlo en el proyecto con Eclipse en la carpeta WEB-INF/lib.

Para poder leer el contenedor desde Java basta con:

Context contextInitial	= new InitialContext();
// Contexto inicial
Context context = (Context) contextInitial.lookup("java:comp/env");
// Nombre del contenedor a cargar en el DataSource
DataSource ds = (DataSource) context.lookup("jdbc/test");

//Carga la conexión
con = ds.getConnection();

Es bastante simple, pero para verle en acción, subí un proyecto a code.google para que puedan mirar como funciona → https://code.google.com/p/tomcat-pool-example/