POOL DE CONEXIONES A TRAVÉS DE TOMCAT 5.5 Objetivo Se pretende utilizar el servidor Tomcat como gestor de conexiones a las bases de datos que utiliza la aplicación. Es de esperar que el resultado sea mucho mejor que utilizar un pool de conexiones propio ya que el propio de Tomcat debe estar mucho más optimizado, además de ser más configurable. Hay que destacar que la configuración dependerá de la versión de Tomcat que estemos utilizando, ya que es distinta la forma de proceder entre las versiones 4.x, 5.0 y 5.5. En nuestro caso, la versión a utilizar es la 5.5.4. Procedimiento El procedimiento a seguir se resume en los siguientes cuatro pasos. 1. Instalar los drivers JDBC En primer lugar debemos copiar los ficheros .jar que contienen los drivers JDBC que vamos a usar en el directorio $CATALINA_HOME/common/lib. Desde ahí estarán disponibles para la aplicación y para el servidor por lo que en principio ya no hará falta distribuirlos con la aplicación. 2. Configurar el fichero WEB-INF/web.xml Por cada fuente JDBC añadimos una entrada como la siguiente en el fichero web.xml <resource-ref> <description>Descripcion del driver</description> <res-ref-name>jdbc/hsqldb</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <description>: descripción textual del recurso. <res-ref-name>: hace las veces de alias para acceder al recurso JDBC. Puede ser cualquier nombre que queramos, pero siempre con el prefijo jdbc/ ya que éste forma parte del nombre JNDI (Java Naming and Directory Interface) que emplea Tomcat para localizar los recursos de la aplicación. <res-type>: indica el tipo de fuente de datos a la que estamos accediendo. El tipo javax.sql.DataSource es el propio de los drivers JDBC. <res-auth>: especifica si la aplicación se registra en el gestor de recursos a través de su propio código fuente o si el contenedor de la aplicación se registra en nombre de la misma de forma automática . Sus valores posibles son Container y Application. 3. Configurar el fichero META-INF/context.xml El siguiente fichero a configurar es context.xml en el directorio META-INF. Es posible que dicho fichero no exista, por lo que deberemos crearlo en tal caso. En este fichero es en el que realmente especificaremos los parámetros de conexión a una base de datos determinada. Deberá existir una entrada <Resource> por cada base de datos que se vaya a emplear y su nombre deberá coincidir con el indicado en el fichero web.xml <Context path="/PrePangea" docBase="PrePangea"> <Resource name="jdbc/hsqldb" auth="Container" type="javax.sql.DataSource" username="user" password="password" driverClassName="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:hsql://phoenix/hsqlDB" maxActive="8" maxIdle="4" /> </Context> El elemento <Context> hace referencia al contexto donde este recurso es válido, esto es, a la aplicación que se está desplegando. Sus propiedades path y docBase hacen referencia al nombre de dicha aplicación. Las propiedades de configuración de <resource> son las siguientes: name: nombre JNDI. Debe ser el mismo nombre que el indicado en web.xml. auth: igual que <res-auth> en el fichero web.xml. type: igual que <res-type> en el fichero web.xml. username: usuario para acceder a la base de datos. password: su contraseña. driverClassName: nombre completo de la clase con el driver JDBC url: url de conexión a la base de datos maxActive: número máximo de instancias activas simultáneas para esta base de datos. maxIdle: número máximo de conexiones simultáneas sin actividad. maxWait: tiempo en milisegundos que esperará el sistema antes de generar una excepción cuando se le solicita una nueva conexión y no haya ninguna disponible. validationQuery: Consulta SQL que puede usarse para comprobar la validez de una conexión. Debe ser un SELECT y devolver al menos una fila. 4. Código de la aplicación El código necesario para que nuestra aplicación acceda a una fuente de datos JDBC a través de un pool de conexiones gestionado por Tomcat es el que sigue: try { // Obtenemos un contexto inicial InitialContext ctx = new InitialContext(); // Obtenemos el contexto de nuestro entorno. La cadena // "java:comp/env" es siempre la misma Context envCtx = (Context) ctx.lookup("java:comp/env"); // Obtenemos una fuente de datos identificada con la cadena que // le hemos asignado en los ficheros de configuración DataSource ds = (DataSource) envCtx.lookup("jdbc/hsqldb"); // Ya podemos obtener una conexión y operar con ella normalmente Connection conn = ds.getConnection(); } catch( Exception e ) {}