Hibernate y Postgres. El dolor de cabeza idle in transaction

por | mayo 21, 2012

Generalmente al trabajar con base de datos en este caso usando java, la gran mayoría de los desarrollos utilizan un framework de persistencia. El más usado parece ser Hibernate, que nos facilita en gran cantidad el trabajo de estar preocupándonos por abrir y cerrar conexiones.

Es recomendable que todas las consultas que generemos inclusive los SELECT estén encapsuladas en transacciones, de tal manera que si por alguna razón nuestro código genera una excepción la conexión manejada correctamente en un bloque finally por ejemplo deberíamos cerrar la conexión para evitar que quede «colgada» de la base de datos.

Mediante PgAdmin podemos verificar aquellas conexiones que se quedaron colgadas, esto es muy peligroso y puede ocacionar que nuestro sistema ya no pueda establecer conexion con nuestra base de datos y por consiguiente el sistema dejará de funcionar.

Veremos unas notificaciones de este estilo:

postgres: <dbname> <dbname> <host> idle in transaction

EL pool de conexiones se llenará rápidamente, la memoria RAM se agotará, la aplicación bloquerá el intento de conexiones y la catástrofe se hará presente.

Personalmente puedo decir que esto puede ocurrir por fallas en la programación de la aplicación, generalmente los programadores lo negarán todo y echarán la culpa a la base de datos y se negarán a revisar sus procedimientos, de mi experiencia puedo asegurar que en todos los casos que he estado involucrado con el desarrollo de sistema, este problema se ha solucionado verificando la programación, rectificando procedimientos erróneos o quitando varios accesos innecesarios a la base de datos.

Por ello mi única recomendación en este caso es: «Revisar la programación», indicar a los programadores que deben cerrar siempre las conexiones, y en el caso de usar hibernate, encerrar todas las query, inclusive los SELECT en transacciones, con sus respectivos bloques try, catch y finally.

Basicamente lo que debería incluirse en nuestra programación es lo siguiente:

[java]
org.hibernate.Session dbSession = HibernateUtil.getSession();
dbSession.getTransaction().begin();

… tu código aqui …

dbSession.getTransaction().commit();
dbSession.close();
[/java]

Como dije antes también es recomendable manejar las excepciones, y el cierre de la transacción deSession.close  debería ir en el bloque finally así siempre se cerrará la conexión inclusive si nuestro código generara una excepción.

Mas información:

https://wiki.duraspace.org/display/DSPACE/Idle+In+Transaction+Problem

3 pensamientos en “Hibernate y Postgres. El dolor de cabeza idle in transaction

  1. Pingback: Hibernate y Postgres. El dolor de cabeza idle in transaction « DbRunas – Noticias y Recursos sobre Bases de Datos

  2. marta

    Buenas tengo un problema,
    Estoy usando postgreSQL con hibernate para construir potlets para Liferay, en un portlet creado con java/spring/hibernate al realizar los insert en BD no hace nada, ni me da error, ni inserta ni nada, sabríais cual puede ser el problema.

    Muchas gracias

Los comentarios están cerrados.