我有一些关于在JSP Web应用程序中使用Hibernate的问题。
hibernate.current_session_context_class
的值应该是多少?
1.那么,应该使用以下哪种说法?为什么呢?
Session s = HibernateUtil.getSessionFactory().openSession();
Session s = HibernateUtil.getSessionFactory().getCurrentSession()
1.最后,“每个Web应用程序一个会话”和“每个请求一个会话”哪个更好?
6条答案
按热度按时间dzhpxtsq1#
正如这篇论坛文章中所解释的,1和2是相关的。如果您将
hibernate.current_session_context_class
设置为thread,然后实现类似于servlet过滤器的东西来打开会话,那么您可以通过使用SessionFactory.getCurrentSession()
在任何其他地方访问该会话。SessionFactory.openSession()
总是打开一个新的会话,您必须在完成操作后关闭该会话。SessionFactory.getCurrentSession()
返回一个绑定到上下文的会话--你不需要关闭它。如果您使用Spring或EJB来管理事务,您可以将它们配置为打开/关闭会话沿着事务。
永远不要使用
one session per web app
- session不是线程安全的对象-不能被多个线程共享。您应该始终使用“每个请求一个会话”或“每个事务一个会话”wfypjpf42#
如果我们讨论SessionFactory.openSession()
如果我们讨论SessionFactory.getCurrentSession()
3wabscal3#
openSession
:当你调用SessionFactory.openSession
时,它总是创建一个新的Session
对象并将其提供给你。您需要显式刷新并关闭这些会话对象。
由于会话对象不是线程安全的,因此在多线程环境中需要为每个请求创建一个会话对象,在Web应用程序中也需要为每个请求创建一个会话。
getCurrentSession
:当你调用SessionFactory.getCurrentSession
时,它会提供给你一个session对象,这个对象在hibernate上下文中,由hibernate内部管理。它绑定到事务范围。调用
SessionFactory.getCurrentSession
时,如果Session
不存在,则创建一个新的Session
,否则使用当前hibernate上下文中的同一会话。当事务结束时,它会自动刷新并关闭会话,因此您不需要在外部执行。如果您在单线程环境中使用hibernate,则可以使用
getCurrentSession
,因为与每次创建一个新会话相比,它的性能更快。使用
getCurrentSession
方法,需要在hibernate.cfg.xml中添加以下属性:brvekthn4#
eiee3dmh5#
beginTransaction ->打开会话提交和回滚->关闭会话
htzpubme6#
SessionFactory:“每个应用程序每个数据库一个SessionFactory”(例如,如果您在我们的应用程序中使用3个数据库,则需要为每个DB创建sessionFactory对象,总共需要创建3个sessionFactory。或者如果你只有一个数据库,一个会话工厂就足够了)。
Session:“一个请求-响应周期一个会话”。您可以在请求到来时打开会话,并且在请求过程完成后关闭会话。注意:-不要为Web应用程序使用一个会话。