5

Conexiones de Hibernate a MySQL mi db no se está cerrando. Después de hacer clic 10 veces en 10 segundos, obtengo esta estadística de conexión de MySQL Workbench (en mi máquina de desarrollo. Soy el único usuario). MySQL Workbench Server Status

tengo los existentesLas conexiones de Hibernate no están cerradas incluso con C3P0 + session.close() explícita

  • C3P0 y funcionando (comprobado de log4j, no hay problema relacionado con C3P0 y parece correr)
  • Un ServletReqestListener que comprueba si hay una sesión abierta y se cierra en método requestDestroyed().
  • El objeto de sesión Hibernate se mantiene en ThreadLocal, por lo que cada solicitud solo tiene una conexión, que se abre en la primera consulta y se cierra en ServletRequestListener.
  • Cada vez que abro una sesión y cierro una sesión, imprimo "Session Abierta" y "Session Closed" en System.out como en el ejemplo del código blow. En cada solicitud, cada actualización de página, obtengo "Session Abierta" y después de "Session Closed", respectivamente. Entonces mi pequeña lógica funciona. Pero la conexión no se cierra.

Mi hibernate.cfg.xml

<property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="hibernate.connection.password">officenic</property> 
<property name="hibernate.connection.url">jdbc:mysql://localhost/officenic</property> 
<property name="hibernate.connection.username">officenic</property> 
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 

<!-- configuration pool via c3p0 --> 
<property name="hibernate.c3p0.acquire_increment">1</property> 
<property name="hibernate.c3p0.idle_test_period">100</property> <!-- seconds --> 
<property name="hibernate.c3p0.max_size">5</property> 
<property name="hibernate.c3p0.max_statements">0</property> 
<property name="hibernate.c3p0.min_size">1</property> 
<property name="hibernate.c3p0.timeout">100</property> <!-- seconds --> 

El código de bloque que llamo en cada donde quiero cerrar la sesión.

if (session == null) 
    return; 

if (session.isOpen()) { 

     if (session.isDirty()) 
     session.flush(); 

    session.close(); 
    System.out.println("Session closed"); 
} 

hacer yo perdido algo?

Respuesta

1
private static final ThreadLocal<Session> session = new ThreadLocal<Session>(); 

public static void closeSession() throws HibernateException { 
    Session s = session.get(); 
    if (s != null) { 
     s.close(); 
     session.remove(); 
    } 
} 

realidad estoy haciendo como esto y funciona

+0

Sí, el mío es algo así también, buena solución. – Seregwethrin

Cuestiones relacionadas