休眠会话是在春天关闭吗?

时间:2018-05-27 01:22:53

标签: java spring-boot hibernate-5.x

我开发了一个带弹簧启动和休眠的简单应用程序。我以前通过sessionfactory.opensession();获取会话是否需要在完成所有操作后手动关闭会话?

在多个请求网络应用中使用opensession()而不是getcurrentsession()是否是个好主意?

1 个答案:

答案 0 :(得分:1)

当你完成时应该关闭(但这可以为你自动完成,因为我们会看到)。 这一切都取决于你如何获得会议。

如果你使用sessionFactory.getCurrentSession(),你将获得一个"当前会话"它绑定到事务的生命周期,并在事务结束(提交或回滚)时自动刷新和关闭。

如果你决定使用sessionFactory.openSession(),你必须自己管理会话并手动刷新并关闭它#34;。

有关详细信息,请查看http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-basics-apptx

好吧,为你编辑:

SessionFactory.openSession()始终会打开一个新会话,您必须在完成操作后关闭该会话。 SessionFactory.getCurrentSession()返回绑定到上下文的会话 - 您不需要关闭它。

<强> EDIT2

hibernate.current_session_context_class用于线程化,然后实现类似于打开会话的servlet过滤器 - 然后您可以使用SessionFactory.getCurrentSession()在其他任何地方访问该会话。

SessionFactory.openSession()始终会打开一个新会话,您必须在完成操作后关闭该会话。 SessionFactory.getCurrentSession()返回绑定到上下文的会话 - 您不需要关闭它。

如果您使用Spring或EJB来管理事务,您可以将它们配置为打开/关闭会话以及事务。

每个Web应用程序永远不应该使用一个会话 - 会话不是线程安全对象 - 不能由多个线程共享。您应该始终使用&#34;每个请求一个会话&#34;或者&#34;每个交易一个会话&#34;