【问题标题】:How to disconnect a Hibernate Session如何断开休眠会话
【发布时间】:2016-04-22 11:56:36
【问题描述】:

在我的网络应用中,我使用 session-per-request 模式。我有一个连接池并在Filter 中使用SessionFactory.openSession()Session.close() 打开会话。

在同一个应用程序中,对于复杂的流程,我想使用 session-per-conversation。我试图用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 两次...

【问题讨论】:

    标签: java hibernate


    【解决方案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
    

    【讨论】:

    • 我知道,但是我在任何地方都读到过会话会话,但不知道实际调用什么来使用它。我应该如何配置 Hibernate 才能断开 Session 与 Connection 的连接?
    • 我应该如何打开会话才能断开连接?
    • @Oliv 我不明白你为什么不想使用session.close()
    • 因为一旦关闭就无法重新打开。你必须创建一个新的,这不是很长的会话。这就是我们现在所做的,在一个复杂的对象图中合并、保存和删除对象是一件很痛苦的事情,其中​​单个对象在多个关联中等等。我想为此对话设置一个单独的会话并在没有的情况下刷新/提交有分离的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多