小编典典

即使使用C3P0 +显式session.close(),休眠连接也不会关闭

hibernate

与MySQL的Hibernate连接未关闭。在大约10秒钟内单击10次后,我从MySQL
Workbench(在我的开发机中。我是唯一的用户)获得此连接统计信息。MySQL Workbench
Server状态

我已经准备好了

  • C3P0并正在运行(从log4j中检查,与C3P0相关的问题没有问题,似乎正在运行)
  • 一个ServletReqestListener,它检查是否存在打开的会话,并在requestDestroyed()方法中将其关闭。
  • Hibernate Session对象保留在ThreadLocal中,因此每个请求只有一个连接,该连接在第一个查询时打开,在ServletRequestListener中关闭。
  • 每次我打开一个会话并关闭一个会话时,都会向System.out输出“ Session Opened”和“ Session Closed”,如代码示例中所示。在每次请求时,每次刷新页面时, 我分别得到“会话打开”和“会话关闭”之后 。所以我的小逻辑行得通。但是连接不会关闭。

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

我想念什么吗?


阅读 291

收藏
2020-06-20

共1个答案

小编典典

好吧,似乎我每次都在创建SessionFactory。链接上有一个不错的类,使SessionFactory静态解决了该问题。http://docs.jboss.org/hibernate/core/3.3/reference/en/html/tutorial.html#tutorial-
firstapp-
helpers

2020-06-20