【问题标题】:Is hibernate session closed by spring?休眠会话是否在春季关闭?
【发布时间】:2018-05-27 01:22:53
【问题描述】:

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

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

【问题讨论】:

  • 你不应该这样做。使用EntityManager 而不是SessionSession 现在甚至扩展了EntityManager),使用@PersistenceContext 注入它,并使用@Transactional 为您处理所有事情。更好的是,您可以使用 Spring Data JPA 为您自动生成大部分 DAO。
  • @chrylis 之前我使用过 Spring JAP,现在我需要通过 Hibernate 来完成。
  • “需要”为什么?
  • @chrylis 表示热情。

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


【解决方案1】:

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

如果您使用 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 应用程序使用一个会话 - 会话不是线程安全对象 - 不能由多个线程共享。您应该始终使用“每个请求一个会话”或“每个事务一个会话”

【讨论】:

  • @asanka12 这个答案是否满足您的查询?
  • 感谢@Adya 的回答。这对我很有帮助。顺便说一句,由于弹簧容器,我处于 ​​vegue 上下文中。如果我从 opensession 获得会话,我需要澄清 spring 是否会为我关闭会话
  • @asanka12 我在ans中添加了更多内容,如果它满足您的查询,请检查并接受它作为答案
  • 您可以通过勾选正确的勾号来接受它作为答案吗?
  • 如果在多线程环境(如 web 应用程序)中使用 hibernate,我需要使用 opensession 或 getcurrentsession 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多