Соединения гибернации не закрываются даже при использовании C3P0 + явный session.close () - PullRequest
5 голосов
/ 18 марта 2012

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

У меня есть те на месте

  • C3P0 и работает (проверено из log4j, нет проблем, связанных с C3P0 и, кажется, работает)
  • ServletReqestListener, который проверяет наличие открытого сеанса и закрывает его в методе requestDestroyed ().
  • Объект Hibernate Session хранится в 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");
}

Я что-то пропустил?

Ответы [ 2 ]

5 голосов
/ 24 марта 2012

Ну, кажется, я создавал SessionFactory каждый раз.Здесь есть хороший класс по ссылке, благодаря которому SessionFactory static решил проблему.http://docs.jboss.org/hibernate/core/3.3/reference/en/html/tutorial.html#tutorial-firstapp-helpers

1 голос
/ 18 марта 2012
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();
    }
}

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

...