Hibernate openSession()vs getCurrentSession()

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

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

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

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

正如这篇论坛post所解释的 ,1和2是相关的。 如果将hibernate.current_session_context_class设置为线程,然后实现类似于打开会话的servletfilter,则可以使用SessionFactory.getCurrentSession()在任何地方访问该会话。

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

如果您使用Spring或EJB来pipe理事务,则可以将它们configuration为与事务一起打开/closures会话。

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

如果我们谈论SessionFactory.openSession()

  • 它总是创build新的Session对象。
  • 您需要显式刷新和closures会话对象。
  • 在单线程环境中,它比getCurrentSession慢。
  • 您不需要configuration任何属性来调用此方法。

如果我们谈论SessionFactory.getCurrentSession()

  • 如果不存在,它将创build一个新的会话,否则使用当前hibernate上下文中的同一个会话。
  • 你不需要刷新和closures会话对象,它将在内部被Hibernate自动处理。
  • 在单线程环境中,它比openSession更快。
  • 您需要configuration其他属性。 “hibernate.current_session_context_class”调用getCurrentSession方法,否则会抛出exception。
 openSession :- When you call SessionFactory.openSession, it always create new Session object afresh and give it to you. 

您需要显式刷新并closures这些会话对象。 由于会话对象不是线程安全的,因此您需要在multithreading环境中为每个请求创build一个会话对象,并在Web应用程序中为每个请求创build一个会话。

 getCurrentSession :- When you call SessionFactory. getCurrentSession, it will provide you session object which is in hibernate context and managed by hibernate internally. It is bound to transaction scope. When you call SessionFactory. getCurrentSession , it creates a new Session if not exists , else use same session which is in current hibernate context. It automatically flush and close session when transaction ends, so you do not need to do externally. If you are using hibernate in single threaded environment , you can use getCurrentSession, as it is faster in performance as compare to creating new session each time. You need to add following property to hibernate.cfg.xml to use getCurrentSession method. <session-factory> <!-- Put other elements here --> <property name="hibernate.current_session_context_class"> thread </property> </session-factory> 

SessionFactory:“每个数据库每个应用程序一个SessionFactory”(例如,如果在我们的应用程序中使用3个DataBase,则需要为每个数据库创buildsessionFactory对象,完全需要创build3个sessionFactorys,否则如果只有一个DataBase One sessionfactory足够 )。

会议:“一个请求 – 响应周期的会话”。 您可以在请求发出时打开会话,并在完成请求过程后closures会话。 注意: – 不要使用一个会话的Web应用程序。