5

Hibernate connessioni a MySQL my db non si chiudono. Dopo aver fatto clic su 10 volte in circa 10 secondi, ottengo le statistiche di connessione da MySQL Workbench (nel mio computer di sviluppo, sono l'unico utente). MySQL Workbench Server Status

ho quelle in vigoreLe connessioni di sospensione non vengono chiuse anche con C3P0 + sessione.close esplicita()

  • C3P0 e in esecuzione (controllato da log4j, nessun problema legato alla C3P0 e sembra funzionare)
  • Un ServletReqestListener che controlla se c'è una sessione aperta e lo chiude in requestDestroyed() metodo.
  • L'oggetto Hibernate Session viene mantenuto in ThreadLocal, quindi ogni richiesta ha solo una connessione, che si apre alla prima query e si chiude in ServletRequestListener.
  • Ogni volta che apro una sessione e chiudo una sessione, emetto "Session Opened" e "Session Closed" su System.out come nell'esempio di codice blow. Ad ogni richiesta, ogni pagina si aggiorna, Ottengo "Sessione aperta" e dopo "Sessione chiusa", in modo ripetitivo. Quindi la mia piccola logica funziona. Ma la connessione non si chiude.

mio 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 --> 

Il codice di blocco che chiamo in ogni dove voglio chiudere la sessione.

if (session == null) 
    return; 

if (session.isOpen()) { 

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

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

Mi manca qualcosa?

risposta

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(); 
    } 
} 

in realtà sto facendo in questo modo e funziona

+0

Sì, anche il mio è una cosa del genere, buona soluzione. – Seregwethrin

Problemi correlati