Hibernate openSession()vs getCurrentSession()

时间:2011-11-08 06:20:50

标签: java hibernate

我对在JSP Web应用程序中使用Hibernate有一些疑问。

  1. hibernate.current_session_context_class的价值应该是什么?

  2. 那么,应该使用以下哪个陈述?为什么?

     Session s = HibernateUtil.getSessionFactory().openSession();
     Session s = HibernateUtil.getSessionFactory().getCurrentSession()
    
  3. 最后,哪个更好“每个网络应用一个会话”或“每个请求一个会话”?

5 个答案:

答案 0 :(得分:134)

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

SessionFactory.openSession()始终会打开一个新会话,您必须在完成操作后关闭该会话。 SessionFactory.getCurrentSession()返回绑定到上下文的会话 - 您不需要关闭它。

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

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

答案 1 :(得分:27)

如果我们谈论SessionFactory.openSession()

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

如果我们谈论SessionFactory.getCurrentSession()

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

答案 2 :(得分:5)

openSession:当您致电SessionFactory.openSession时,它始终会创建一个新的Session对象并将其提供给您。

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

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

getCurrentSession:当你调用SessionFactory.getCurrentSession时,它将为你提供处于休眠上下文并由内部hibernate管理的会话对象。它与事务范围有关。

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

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

您需要将以下属性添加到 hibernate.cfg.xml 以使用getCurrentSession方法:

<session-factory>
    <!--  Put other elements here -->
    <property name="hibernate.current_session_context_class">
          thread
    </property>
</session-factory>

答案 3 :(得分:0)

+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| 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>                       |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+

答案 4 :(得分:-4)

SessionFactory:&#34;每个数据库每个应用程序一个SessionFactory&#34; ( 例如。, 如果你在我们的应用程序中使用3个DataBase,你需要为每个DB创建sessionFactory对象,完全需要创建3个sessionFactorys。或者如果你只有一个DataBase One会话就足够了 )。

会话:&#34;一个会话,用于一个请求 - 响应周期&#34;。您可以在请求到来时打开会话,并且可以在完成请求过程后关闭会话。 注意: - 不要将一个会话用于Web应用程序。