首页 > 解决方案 > 休眠会话是否在春季关闭?

问题描述

我开发了一个带有 spring boot 和 hibernate 的简单应用程序。我曾经通过sessionfactory.opensession();在完成所有事情后是否需要手动关闭会话来获取会话?

opensession()使用而不是getcurrentsession()在多个请求 Web 应用程序中使用是个好主意吗?

标签: javaspring-boothibernate-5.x

解决方案


完成后应该关闭它(但我们将看到这可以自动为您完成)。这完全取决于您如何获得会话。

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

如果您决定使用 sessionFactory.openSession(),则必须自己管理会话并“手动”刷新和关闭它。

有关更多信息,您可以查看http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-basics-apptx

好吧,给你一个编辑:

SessionFactory.openSession() 总是打开一个新的会话,一旦你完成操作就必须关闭它。SessionFactory.getCurrentSession() 返回绑定到上下文的会话 - 您不需要关闭它。

编辑2

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

SessionFactory.openSession() 总是打开一个新的会话,一旦你完成操作就必须关闭它。SessionFactory.getCurrentSession() 返回绑定到上下文的会话 - 您不需要关闭它。

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

您永远不应该为每个 Web 应用程序使用一个会话 - 会话不是线程安全对象 - 不能由多个线程共享。您应该始终使用“每个请求一个会话”或“每个事务一个会话”


推荐阅读