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,请考虑以下这些替代策略:
在 Spring Boot 中禁用 OSIV
在 Spring Boot 中,OSIV 默认启用。要禁用它,请将以下属性添加到您的 application.properties 配置文件中:
spring.jpa.open-in-view=false
通过禁用 OSIV,您可以更好地控制数据获取、确保事务完整性并提高应用程序性能。
以上是你应该在视图模式中使用 Hibernate 的 Open Session 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!