我对在JSP Web应用程序中使用Hibernate有一些疑问。
hibernate.current_session_context_class
的价值应该是什么?
那么,应该使用以下哪个陈述?为什么?
Session s = HibernateUtil.getSessionFactory().openSession();
Session s = HibernateUtil.getSessionFactory().getCurrentSession()
最后,哪个更好“每个网络应用一个会话”或“每个请求一个会话”?
答案 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()
如果我们谈论SessionFactory.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应用程序。