【问题标题】:Reuse Hibernate session in thread在线程中重用 Hibernate 会话
【发布时间】:2010-05-08 11:28:22
【问题描述】:

我在某处读到,当刷新会话或提交事务时,会话本身会被 Hibernate 关闭。那么,我如何在同一个线程中重用之前关闭的 Hibernate Session?

谢谢

【问题讨论】:

    标签: java hibernate transactions


    【解决方案1】:

    我在某处读到,当刷新会话或提交事务时,会话本身会被 Hibernate 关闭。

    flush 确实关闭会话。但是,从 Hibernate 3.1 开始,如果您将 current_session_context_class 配置为“thread”或“jta”,或者如果您使用的是 TransactionManagerLookup(强制性 JTA),commit 将关闭会话和getCurrentSession()

    以下代码说明了这一点(此处将current_session_context_class 设置为thead):

    Session session = factory.getCurrentSession();
    Transaction tx = session.beginTransaction();
    
    Product p = new Product();
    session.persist(p);
    session.flush();
    System.out.println(session.isOpen()); // prints true
    
    p.setName("foo");
    session.merge(p);
    tx.commit();
    System.out.println(session.isOpen()); // prints false
    

    请参阅文档中的this thread 和2.5. Contextual sessions 部分了解相关背景信息。

    那么,我怎样才能在同一个线程中重用之前关闭的 Hibernate Session?

    使用内置的“managed”策略(将current_session_context_class 属性设置为managed)或使用自定义CurrentSessionContext ThreadLocalSessionContext 派生并覆盖ThreadLocalSessionContet.isAutoCloseEnabled().

    再次,请参阅上面的链接以及What about the extended Session pattern for long Conversations?

    【讨论】:

    • 如果 current_session_context_class 为 "thread" 或 "jta" 是否会回滚并关闭会话?
    【解决方案2】:

    错了。会话保持打开状态,只是一个新事务开始。主要的是当前附加到会话的所有对象都保持附加,因此如果您不清除会话,则此处存在内存泄漏。

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 1970-01-01
      • 2014-01-28
      • 2013-02-01
      • 2010-12-12
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多