Hibernate openSession() vs getCurrentSession()

2022-08-31 08:16:33

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

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

  2. 那么,应使用以下哪项语句呢?为什么呢?

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


答案 1

如本论坛帖子中所述,1 和 2 是相关的。如果设置为 thread,然后实现类似于 servlet 过滤器的方法来打开会话 - 那么您可以使用 .hibernate.current_session_context_classSessionFactory.getCurrentSession()

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

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

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


答案 2

如果我们谈论SessionFactory.openSession()

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

如果我们谈论SessionFactory.getCurrentSession()

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

推荐