首页 >Java >java教程 >你应该在视图模式中使用 Hibernate 的 Open Session 吗?

你应该在视图模式中使用 Hibernate 的 Open Session 吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-25 10:39:15902浏览

Should You Use Hibernate's Open Session in View Pattern?

Hibernate 在视图模式中打开会话的缺点

Hibernate 在视图中打开会话 (OSIV) 模式在整个请求的整个过程中维护一个打开会话生命周期。虽然这种方法看起来很方便,但它有几个陷阱:

1。缺乏事务控制
OSIV 允许在托管事务之外进行数据操作,从而导致数据不一致。 UI 渲染期间执行的每个语句都以自动提交模式发生,这会增加 I/O 开销并可能损害数据库性能。

2.混合关注点
OSIV 模糊了服务层和 UI 层之间的分离,因为语句是由两者生成的。这使得测试变得复杂,并且使得隔离层变得更加困难。

3. N 1 查询性能问题
OSIV 将 UI 层限制为导航关联,这可能会导致 N 1 查询问题。虽然 Hibernate 提供了 @BatchSize 和 FetchMode.SUBSELECT 等缓解措施,但它们会影响默认的获取计划,并且可能并非适合所有场景。

4.资源管理
OSIV 在整个 UI 渲染阶段保持数据库连接打开。这种延长的连接租用可能会在连接池中造成拥塞,从而限制可扩展性和吞吐量。

OSIV 的替代方案

要在解决 OSIV 的限制的同时避免 LazyLoadExceptions,请考虑以下这些替代策略:

  • 渴望获取:在服务层中急切地初始化所有必需的关联,以避免延迟加载错误。
  • FetchMode.JOIN:在查询中使用 FetchMode.JOIN 来急切地加载特定关联。
  • 批量获取:利用@BatchSize批量获取关联并改进
  • DTO 投影: 创建封装相关数据的 DTO(数据传输对象),而不包含惰性关联。

在 Spring Boot 中禁用 OSIV

在 Spring Boot 中,OSIV 默认启用。要禁用它,请将以下属性添加到您的 application.properties 配置文件中:

spring.jpa.open-in-view=false

通过禁用 OSIV,您可以更好地控制数据获取、确保事务完整性并提高应用程序性能。

以上是你应该在视图模式中使用 Hibernate 的 Open Session 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn