【问题标题】:Difference b/w Hibernate's Sessionfactory.getCurrentSession() and SessionFactory.openSession()黑白 Hibernate 的 Sessionfactory.getCurrentSession() 和 SessionFactory.openSession() 的区别
【发布时间】:2012-04-21 18:38:00
【问题描述】:

我对这两者有点困惑。据我所知,两者都返回休眠会话,SessionFactory.getCurrentSession() 返回基于在 hibernate.cfg.xml 中设置的属性 <property name="current_session_context_class"> 的上下文会话 我们不应该一直采用这种方法吗?

SessionFactory.openSession() 增加了什么附加价值?

【问题讨论】:

    标签: java hibernate orm persistence


    【解决方案1】:

    第一次调用sf.getCurrentSession() 时会打开一个会话。如果一个会话不存在,这将创建一个全新的会话,如果一个会话已经存在,则使用一个现有会话。

    在 Tomcat 中,这会将会话与使用底层 ThreadLocal 对象创建的线程相关联。但是由于 Tomcat 使用线程池,一个请求完全有可能接收到一个已经关联了会话的线程,从而引入了甚至不创建全新会话的可能性。另一件事是您使用sf.getCurrentSession() 获得的 Session 会自动刷新并关闭。

    另一方面,sf.openSession() 方法会创建一个新会话,但不会尝试将其与线程相关联。但请记住,sf.openSession() 引入了另一个障碍,它希望用户自己处理会话的关闭和刷新,而不是让 Hibernate 自动为我们处理。

    sf.getCurrentSession() 通常就足够了。 sf.openSession() 提供并促进了对会话存储和管理位置的更高级别的管理。这当然是一个高级选项。

    【讨论】:

    • 这是否意味着如果我在 tomcat 中为多线程使用 sf.getCurrentSession - 它将使用相同的会话?没事吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    相关资源
    最近更新 更多