Hibernate openSession()与getCurrentSession()

e5njpo68  于 2023-06-23  发布在  其他
关注(0)|答案(6)|浏览(99)

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

  1. hibernate.current_session_context_class的值应该是多少?
    1.那么,应该使用以下哪种说法?为什么呢?
Session s = HibernateUtil.getSessionFactory().openSession();
 Session s = HibernateUtil.getSessionFactory().getCurrentSession()

1.最后,“每个Web应用程序一个会话”和“每个请求一个会话”哪个更好?

dzhpxtsq

dzhpxtsq1#

正如这篇论坛文章中所解释的,1和2是相关的。如果您将hibernate.current_session_context_class设置为thread,然后实现类似于servlet过滤器的东西来打开会话,那么您可以通过使用SessionFactory.getCurrentSession()在任何其他地方访问该会话。
SessionFactory.openSession()总是打开一个新的会话,您必须在完成操作后关闭该会话。SessionFactory.getCurrentSession()返回一个绑定到上下文的会话--你不需要关闭它。
如果您使用Spring或EJB来管理事务,您可以将它们配置为打开/关闭会话沿着事务。
永远不要使用one session per web app- session不是线程安全的对象-不能被多个线程共享。您应该始终使用“每个请求一个会话”或“每个事务一个会话”

wfypjpf4

wfypjpf42#

如果我们讨论SessionFactory.openSession()

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

如果我们讨论SessionFactory.getCurrentSession()

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

3wabscal3#

openSession:当你调用SessionFactory.openSession时,它总是创建一个新的Session对象并将其提供给你。
您需要显式刷新并关闭这些会话对象。
由于会话对象不是线程安全的,因此在多线程环境中需要为每个请求创建一个会话对象,在Web应用程序中也需要为每个请求创建一个会话。
getCurrentSession:当你调用SessionFactory.getCurrentSession时,它会提供给你一个session对象,这个对象在hibernate上下文中,由hibernate内部管理。它绑定到事务范围。
调用SessionFactory.getCurrentSession时,如果Session不存在,则创建一个新的Session,否则使用当前hibernate上下文中的同一会话。当事务结束时,它会自动刷新并关闭会话,因此您不需要在外部执行。
如果您在单线程环境中使用hibernate,则可以使用getCurrentSession,因为与每次创建一个新会话相比,它的性能更快。
使用getCurrentSession方法,需要在hibernate.cfg.xml中添加以下属性:

<session-factory>
    <!--  Put other elements here -->
    <property name="hibernate.current_session_context_class">
          thread
    </property>
</session-factory>
brvekthn

brvekthn4#

+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| 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>                       |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
eiee3dmh

eiee3dmh5#

currentSession -> to fetch the session

beginTransaction ->打开会话提交和回滚->关闭会话

htzpubme

htzpubme6#

SessionFactory:“每个应用程序每个数据库一个SessionFactory”(例如,如果您在我们的应用程序中使用3个数据库,则需要为每个DB创建sessionFactory对象,总共需要创建3个sessionFactory。或者如果你只有一个数据库,一个会话工厂就足够了)。
Session:“一个请求-响应周期一个会话”。您可以在请求到来时打开会话,并且在请求过程完成后关闭会话。注意:-不要为Web应用程序使用一个会话。

相关问题