即使使用C3P0+显式会话.close(),Hibernate连接也不会关闭



到MySQL my db的Hibernate连接没有关闭。在10秒内点击10次后,我从MySQL工作台(在我的开发机器中。我是唯一的用户)获得了连接统计信息。MySQL工作台服务器状态

我已经准备好了

  • C3P0和正在运行(从log4j中检查,没有与C3P0相关的问题,并且似乎正在运行)
  • 一个Servlet请求侦听器,它检查是否有打开的会话,并在requestDestroyed()方法中关闭它
  • Hibernate会话对象保存在ThreadLocal中,因此每个请求只有一个连接,该连接在第一个查询时打开,并在ServletRequestListener中关闭
  • 每次打开会话和关闭会话时,我都会将"会话已打开"one_answers"会话已关闭"输出到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");
}

我错过什么了吗?

看来我每次都在创建SessionFactory。链接处有一个不错的类,使SessionFactory静态解决了这个问题。http://docs.jboss.org/hibernate/core/3.3/reference/en/html/tutorial.html#tutorial-firstapp助手

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

实际上我是这样做的,它工作

最新更新