如何断开Hibernate会话

时间:2016-04-22 11:56:37

标签: java hibernate

在我的网络应用中,我使用 session-per-request 模式。我使用Filter然后SessionFactory.openSession()Session.close()中建立了连接池和开放会话。

在同一个应用中,对于复杂的流程,我想使用会话每会话。我尝试使用SessionFactory.openSession()开设第二个会话,但随后调用Session.disconnect()不执行任何操作。

如何手动连接/断开会话?这是我的Hibernate配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost/.....</property>
    <property name="hibernate.connection.username">...</property>
    <property name="hibernate.connection.password">...</property>

    <property name="hibernate.c3p0.min_size">1</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.test_connection_on_checkout">true</property>

    <property name="hibernate.cache.use_second_level_cache">true</property>
  </session-factory>
</hibernate-configuration>

Java代码:

longSession = mySessionFactory.openSession();
System.out.println(((SessionImplementor) longSession).isConnected());
longSession.disconnect();
System.out.println(((SessionImplementor) longSession).isConnected());

这两次输出true ...

1 个答案:

答案 0 :(得分:1)

我认为这与Hibernate Documents中的这个说明有关:

  

请注意,在连接所在的会话中调用disconnect()   由Hibernate通过其配置的ConnectionProvider检索   如果ConnectionReleaseMode.ON_CLOSE无效

,则无效

另请注意Documentation for session-per-conversation:

  

提交数据库事务会断开JDBC与会话的连接   连接并返回到池的连接

这就是说你只需要提交事务来返回到池的连接,除了对话中的最后一个事务:

// foo is an instance loaded earlier by the old session
Transaction t = session.beginTransaction(); // Obtain a new JDBC connection, start transaction

foo.setProperty("bar");

session.flush();    // Only for last transaction in conversation
t.commit();         // Also return JDBC connection
session.close();    // Only for last transaction in conversation