Answers:
如本论坛帖子所述,1和2是相关的。如果设置hibernate.current_session_context_class
为线程,然后实现打开会话的servlet过滤器之类的东西,则可以使用来访问该会话SessionFactory.getCurrentSession()
。
SessionFactory.openSession()
操作完成后,始终会打开一个新会话,您必须关闭该会话。SessionFactory.getCurrentSession()
返回绑定到上下文的会话-您无需关闭它。
如果您使用Spring或EJB管理事务,则可以将它们配置为与事务一起打开/关闭会话。
您永远不要使用one session per web app
-会话不是线程安全的对象-不能被多个线程共享。您应该始终使用“每个请求一个会话”或“每个事务一个会话”
Sessions
。你能帮帮我吧在- stackoverflow.com/questions/23351083/...。谢谢你和chenqui。
如果我们谈论SessionFactory.openSession()
如果我们谈论SessionFactory.getCurrentSession()
getCurrentSession
,它将重复使用同一会话,不是吗?
openSession
:当您调用时SessionFactory.openSession
,它总是创建一个新Session
对象并将其提供给您。
您需要显式刷新并关闭这些会话对象。
由于会话对象不是线程安全的,因此您需要在多线程环境中为每个请求创建一个会话对象,在Web应用程序中也为每个请求创建一个会话。
getCurrentSession
:调用时SessionFactory.getCurrentSession
,它将为您提供会话对象,该对象位于休眠上下文中,并在内部由休眠管理。它绑定到事务范围。
调用时SessionFactory.getCurrentSession
,它将创建一个新的(Session
如果不存在的话),否则使用当前休眠上下文中的相同会话。当事务结束时,它将自动刷新并关闭会话,因此您无需在外部进行操作。
如果您在单线程环境中使用休眠模式,则可以使用getCurrentSession
,因为与每次创建新会话相比,它的性能更快。
您需要在hibernate.cfg.xml中添加以下属性才能使用getCurrentSession
方法:
<session-factory>
<!-- Put other elements here -->
<property name="hibernate.current_session_context_class">
thread
</property>
</session-factory>
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| 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> |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
openSession()
或close()
。他只打电话getCurrentSession()
。我想他要去current_session_context
了thread
。现在我想我明白了getCurrentSession()
。但是,我不知道该何时使用openSession()
。