5

我的数据库与 MySQL 的休眠连接没有关闭。在 10 秒内单击 10 次后,我从 MySQL Workbench (在我的开发机器中。我是唯一的用户)获得了这个连接统计信息。MySQL Workbench 服务器状态

我有这些

  • 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");
}

我错过了什么吗?

4

2 回答 2

5

好吧,看来我每次都在创建 SessionFactory。链接上有一个很好的类,使 SessionFactory static 解决了这个问题。http://docs.jboss.org/hibernate/core/3.3/reference/en/html/tutorial.html#tutorial-firstapp-helpers

于 2012-03-24T15:49:21.260 回答
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();
    }
}

实际上我正在这样做并且它有效

于 2012-03-18T04:50:11.893 回答