猿问

Hibernate openSession()vs getCurrentSession()

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. 最后,哪一个更好“每个网络应用一个会话”或“每个请求一个会话”?


沧海一幻觉
浏览 517回答 3
3回答

慕田峪7331174

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

元芳怎么了

openSession:当你打电话时SessionFactory.openSession,它总是创建一个新Session对象并交给你。您需要显式刷新和关闭这些会话对象。由于会话对象不是线程安全的,因此您需要在多线程环境中为每个请求创建一个会话对象,并在Web应用程序中为每个请求创建一个会话。getCurrentSession:当你调用时SessionFactory.getCurrentSession,它将为你提供处于休眠上下文并由内部hibernate管理的会话对象。它与事务范围有关。当你调用时SessionFactory.getCurrentSession,它会创建一个新的,Session如果它不存在,否则使用当前hibernate上下文中的相同会话。它会在事务结束时自动刷新和关闭会话,因此您无需在外部执行此操作。如果您在单线程环境中使用hibernate,则可以使用getCurrentSession,因为与每次创建新会话相比,它的性能更快。您需要将以下属性添加到hibernate.cfg.xml以使用getCurrentSession方法:<session-factory> &nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;&nbsp;Put&nbsp;other&nbsp;elements&nbsp;here&nbsp;--> &nbsp;&nbsp;&nbsp;&nbsp;<property&nbsp;name="hibernate.current_session_context_class"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread&nbsp;&nbsp;&nbsp;&nbsp;</property></session-factory>
随时随地看视频慕课网APP

相关分类

Java
我要回答