Saturday, October 22, 2005

Como hacer un JDBC Datasources con Database Connection Pool en Tomcat y Hibernate

Durante la creación de mi projecto campusip, agregé esta caracteristica al projecto, para mejorar el rendimiento en cuanto a el manejo de session y transacciones con la base de datos (cualquiera que sea esta).

Un pool de conecciones se encarga de crear y manegar las conecciones a un a base de datos determinada. la ventaja es que se recicla y se reusa las conecciones a las DB, siendo esto más eficiente que crear una nueva cada vez. El componente utilizado aqui es Jakarta-Commons DBCP el cual hace lo que acabamos de describir.

Tomcat 5.5.X ha hecho cambio de como se hace una configuración JNDI para una conección JDBC. Ya no se cambia el archivo server.xml, todos los cambios se hacen en el directorio de la webapp y se debe tomar en cuenta el nombre de la webapp. (en nuestro caso campusip)

  1. Modificar web.xml, context.xml y hibernate.cfg.xml segun ejemplos dados debajo.
  2. Instalar los driver de JDBC: se debe copiar el driver JDBC de la base de datos usada (En mi caso postgresql ) a esta dirección $CATALINA_HOME/common/lib, donde CATALINA_HOME es la dirección de instalacion de Tomcat. (Es un archivo *.jar )
  3. Instalar los driver de DBCP connection pool, entonces se debe copiar a la direccion $CATALINA_HOME/common/lib/naming-factory-dbcp.jar.
  4. Copiar el archivo webapps/campusip/META-INF/context.xml con el nombre cambiado para %Tomcat 5.5%\conf\Catalina\localhost/campusip.xml - el archivo no sufre cambios.
  5. Cualquier otra ver documentación.
Estos procedimiento (NI pienses que lo hago manual :-D) son de manera automátizada atravez de una herramienta de la cual ya he hablado llamada Ant, utilizando el build.xml del projecto.

Y ya solo es cuestión de probar la aplicación web.

context.xml :


<Context path="/campusip" docBase="campusip"
debug="5" reloadable="true" crossContext="true">

<Resource name="jdbc/campusipDB" auth="Container" type="javax.sql.DataSource"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/jcolegioip"
username="postgres" password="postgres" maxActive="20" maxIdle="10"
maxWait="-1"/>

</Context>


----


web.xml (solo la parte de resource ):



<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">



...

<resource-ref>
<description>Connection to my DB.</description>
<res-ref-name>jdbc/campusipDB</res-ref-name>
<res-type>javax.sql.DataSource </res-type>
<res-auth>Container</res-auth>



</resource-ref>

...

</web-app>

------

hibernate.cfg.xml (solo la parte de la DB):


<session-factory>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>

<property name="connection.datasource">java:/comp/env/jdbc/campusipDB</property>

...

</session-factory>
</hibernate-configuration>
----

Nota : Tomcat viene con un sistema de JNDI de sólo lectura. . ver documentación

2 comments:

Felipe said...

Tienes un error en la parte que dice web.xml, es decir, pusiste 2 veces web.xml cuando estabas hablando sobre los archivos web.xml y context.xml. Es comprensible de todas maneras, pero lo podrías arreglar para que quedara mas claro desde el principio.

Saludos. Felipe.

Victor Sosa said...

Gracias, esta arreglado