Hibernate Open Session in View:陷阱和替代方案
Open Session in View 尽管其表面上很简单,但存在一些缺点,需要谨慎使用。
视图中开放会话的问题
虽然该方法可以缓解痛点在孤立的 JVM 场景中,这是有代价的:
-
UI 渲染中的自动提交模式:服务层事务完成、Session 关闭后,后续 UI 渲染会触发自动提交模式:
提交每条语句,由于 I/O 过多而增加数据库负载。-
关注点分离丢失:
语句生成跨越服务层和 UI 层,使集成测试和业务逻辑的隔离变得复杂。-
潜在的 N 1 查询问题:
UI 导航仅限于遍历关联,这可能会加剧性能问题未急切获取关联。-
连接租用时间增加:
数据库连接可能在整个 UI 渲染过程中保持打开状态,从而导致拥塞和有限的事务吞吐量。
替代策略
要避免在视图中打开会话的陷阱,请考虑以下替代方案:
-
急切获取:
获取 EntityManager 中所有必要的关联范围,确保 UI 渲染期间不会触发延迟初始化。-
获取模式自定义:
明智地使用 Hibernate 的 @BatchSize 和 FetchMode.SUBSELECT 注解来优化关联获取,而不影响所有业务场景。-
数据访问层查询:
创建专门针对特定数据获取的定制查询特定用例的要求。
Spring Boot 配置
在 Spring Boot 中,默认启用在视图中打开会话。要禁用它,请在 application.properties 配置中设置以下属性:
spring.jpa.open-in-view=false
这将强制正确处理 LazyInitializationExceptions,避免与在视图中打开会话相关的不良后果。
以上是View 中的公开会话是正确的选择吗?陷阱和更好的选择的详细内容。更多信息请关注PHP中文网其他相关文章!