Hibernate openSession() vs getCurrentSession()

关于在 JSP Web 应用程序中使用 Hibernate,我有一些问题。

  1. hibernate.current_session_context_class的值应该是多少?

  2. 那么,应该使用下列哪个语句? 为什么?

     Session s = HibernateUtil.getSessionFactory().openSession();
    Session s = HibernateUtil.getSessionFactory().getCurrentSession()
    
  3. Lastly, which one is better "one session per web app" or "one session per request"?

207033 次浏览

正如本论坛 邮寄所解释的,1和2是相关的。如果您将 hibernate.current_session_context_class设置为线程,然后实现类似于 servlet 过滤器的东西来打开会话-那么您可以使用 SessionFactory.getCurrentSession()在任何其他地方访问该会话。

SessionFactory.openSession()总是打开一个新的会话,一旦完成操作就必须关闭该会话。SessionFactory.getCurrentSession()返回一个绑定到上下文的会话——您不需要关闭它。

如果您使用 Spring 或 EJB 来管理事务,您可以将它们配置为与事务一起打开/关闭会话。

永远不要使用 one session per web app-session 不是线程安全对象-不能被多个线程共享。您应该始终使用“每个请求一个会话”或“每个事务一个会话”

SessionFactory: “每个数据库中每个应用程序一个 SessionFactory” ( 例如: 如果在我们的应用程序中使用3个数据库,那么每个数据库都需要创建 sessionFactory 对象,完全需要创建3个 sessionFactorys。否则,如果只有一个 DataBaseOne 会话工厂就足够了 ).

会话: “一个会话对应一个请求-响应周期”。您可以在请求来时打开会话,在请求过程完成后关闭会话。 注意:-不要为 web 应用程序使用一个会话。

如果我们谈论 SessionFactory.openSession ()

  • 它总是创建一个新的 Session 对象。
  • 您需要显式刷新和关闭会话对象。
  • 在单线程环境中,它比 getCurrentSession ()慢。
  • 调用此方法不需要配置任何属性。

如果我们谈论 SessionFactory.getCurrentSession ()

  • 如果不存在,则创建一个新会话,否则使用当前休眠上下文中的相同会话。
  • 您不需要刷新和关闭会话对象,它将由 Hibernate 内部自动处理。
  • 在单线程环境中,它比 openSession ()快。
  • 您需要配置其他属性“ hibernate.current _ session _ context _ class”来调用 getCurrentSession ()方法,否则它将抛出异常。

openSession: 当你调用 SessionFactory.openSession时,它总是创建一个新的 Session对象并给你。

您需要显式地刷新和关闭这些会话对象。

由于会话对象是 没有线程安全的,因此在多线程环境中每个请求需要创建一个会话对象,在 Web 应用程序中每个请求也需要创建一个会话对象。

getCurrentSession: 当您调用 SessionFactory.getCurrentSession时,它将为您提供在 hibernate 上下文中并由 hibernate 内部管理的会话对象。它绑定到事务范围。

当您调用 SessionFactory.getCurrentSession时,如果 Session不存在,它将创建一个新的 Session,否则使用当前休眠上下文中的相同会话。当事务结束时,它会自动刷新和关闭会话,因此不需要在外部执行此操作。

如果在单线程环境中使用 hibernate,则可以使用 getCurrentSession,因为与每次创建一个新会话相比,它的性能更快。

要使用 getCurrentSession方法,需要向 Cfg.xml添加以下属性:

<session-factory>
<!--  Put other elements here -->
<property name="hibernate.current_session_context_class">
thread
</property>
</session-factory>
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Parameter            |                                openSession                                 |                                          getCurrentSession                                          |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Session  creation    | Always open new session                                                    | It opens a new Session if not exists , else use same session which is in current hibernate context. |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Session close        | Need to close the session object once all the database operations are done | No need to close the session. Once the session factory is closed, this session object is closed.    |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Flush and close      | Need to explicity flush and close session objects                          | No need to flush and close sessions , since it is automatically taken by hibernate internally.      |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Performance          | In single threaded environment , it is slower than getCurrentSession       | In single threaded environment , it is faster than openSession                                      |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Configuration        | No need to configure any property to call this method                      | Need to configure additional property:                                                              |
|                      |                                                                            |  <property name=""hibernate.current_session_context_class"">thread</property>                       |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+