miércoles, 8 de junio de 2011

¿Un Tomcat Transaccional?

Vamos a explicar como incorporar en Tomcat la capacidad de coordinar transacciones entre diferentes bases de datos, usando el API estándar JTA (Java Transaction API), que permite englobar en una misma transacción acciones con distintas bases de datos, coordinadas por un Transaction Manager que corre dentro de Tomcat. Para que una base de datos pueda participar en una transacción distribuida de este tipo, debe tener un driver JDBC capaz de soportar este tipo de tareas, y el manejador como tal también debe ser compatible con "XA Transactions".

Tomcat por defecto es un contenedor de servlets, no un servidor de aplicaciones completo JEE, por eso no cubre esta funcionalidad de un coordinador de transacciones. Un servidor de aplicaciones JEE si incorpora esta facilidad y muchas más que en general no son necesarias para desarrollar aplicaciones web eficientes. Nosotros preferimos partir de un servidor liviano y rápido como Tomcat y luego añadirle lo que realmente necesitamos del estándar JEE. Así lo hicimos con el caso de las transacciones JTA, integramos un producto muy fácil de usar, JOTM - Java Open Transaction Manager.

La integración es muy sencilla, pero nosotros la simplificamos aun más, consolidando en un solo JAR todo el subsistema de JOTM. Lo pueden descargar desde nuestro website, deben añadirlo a la carpeta "tomcat6/lib". En el context.xml de la aplicación donde se definen los pools de conexiones es donde vienen los cambios clave:

<Context>

<Resource name="jdbc/dinamica" auth="Container" type="javax.sql.DataSource"
factory="org.objectweb.jotm.datasource.DataSourceFactory"
initialSize="5" maxActive="20" maxIdle="5" maxWait="3000"
username="postgres" password="basica"
driverClassName="org.postgresql.Driver" url="jdbc:postgresql://localhost/demodb" />

<Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60"/>

</Context>

Como pueden ver lo único nuevo es el la incorporación del elemento "Transaction" y también el factory que se utiliza para el pool de conexiones, que es especial para el manejador de transacciones.

En el caso de Dinámica el uso del coordinador de transacciones es transparente, ya que se implementó como un filtro, por la vía de los "filter-mapping" se le indica que Actions debe englobar, y el Action o proceso server-side de Dinámica procederá a ejecutar su lógica de negocios sin preocuparse por el manejo de la transacción, incluso si se ejecuta la lógica contra varias bases de datos. El filtro coordina, garantiza un COMMIT si no hay error o un ROLLBACK que mantendrá la consistencia en todas las BD involucradas si hay error.


De esta manera, usando un producto compacto open source de fácil integración con Tomcat, y las bondades de una especificación de servlets tan bien pensada, se le añaden a Tomcat características empresariales sin complicarlo ni ponerlo más pesado.

Un abrazo,
El Team Dinámica

No hay comentarios: