5

Спящий режим соединения с MySQL my db не закрывается. После нажатия 10 раз, как 10 секунд, я получаю эту статистику соединений из MySQL Workbench (на моей машине разработки. Я единственный пользователь). MySQL Workbench Server Status

У меня есть те, на местеСоединения спящего режима не закрыты даже с C3P0 + явным session.close()

  • C3P0 и работает (проверено с log4j, никаких проблем, связанных с C3P0 и, кажется, работает)
  • ServletReqestListener, который проверяет, есть открытая сессия и закрывает его в requestDestroyed() метод.
  • Объект сеанса Hibernate хранится в ThreadLocal, поэтому каждый запрос имеет только одно соединение, которое открывается при первом запросе и закрывается в ServletRequestListener.
  • Каждый раз, когда я открываю сеанс и закрываю сеанс, я выводил «Session Opened» и «Session Closed» на System.out, как в примере с кодом. По каждому запросу обновляется каждая страница, Я получаю «Сессию открыта» и после «Сессия закрыта», соответственно. Итак, моя маленькая логика работает. Но соединение не закрывается.

Мой 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 --> 

Код-блок заезжаю каждый раз, когда я хочу, чтобы закрыть сессию.

if (session == null) 
    return; 

if (session.isOpen()) { 

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

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

Пропустить что-нибудь?

ответ

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

на самом деле я делаю так, и это работает

+0

Да, мое тоже что-то подобное, хорошее решение. – Seregwethrin

 Смежные вопросы

  • Нет связанных вопросов^_^