Hibernate Open Session in View:一种有争议的实践
简介
Open Session In View (OSIV) 是 Hibernate 的一项功能,允许 Hibernate 会话在休眠期间保持打开状态。请求-响应周期。这种做法在 Java 社区中一直是争论的话题,一些人提倡它的便利性,而另一些人则质疑它的缺点。
OSIV 的问题
OSIV 提出了一些挑战:
-
事务处理不一致: OSIV 保持会话无限期地开放,绕过典型的交易生命周期。这可能会导致意想不到的后果,例如数据一致性问题。
-
数据库性能下降:保持会话打开会给数据库带来压力,因为在响应处理期间执行的任何其他语句(例如,惰性关联初始化)以自动提交模式发出。
-
模糊层分离: OSIV 模糊了业务层和 UI 渲染阶段之间的关注点分离,使得应用程序的测试和维护变得困难。
-
增加连接租用时间:会话可以保持开放状态延长时间,限制数据库连接池的资源。
替代方案策略
为了避免这些问题,开发人员可以采用替代策略:
-
显式初始化惰性关联:使用 Join 初始化服务层中的惰性关联Fetch 或 FetchMode.SUBSELECT。
-
创建单独的 DAO查询: 为 UI 层编写特定的 DAO 查询,这些查询专门用于仅获取必要的关联。
-
使用视图投影: 创建仅返回所需的基本字段的投影UI 而不是完整的实体。
-
使用 FetchMode.LAZY 和 EAGER Loading: 配置FetchMode.LAZY 用于不立即需要的实体,FetchMode.EAGER 用于必须预先加载的关联。
在 Spring Boot 中禁用 OSIV
Spring Boot 启用 OSIV默认情况下。要禁用它,请在 application.properties 文件中设置以下属性:
此设置可确保 Hibernate 会话在每个服务层事务后关闭,从而防止与 OSIV 相关的潜在缺陷。
以上是Hibernate Open Session in View:使用还是不使用?的详细内容。更多信息请关注PHP中文网其他相关文章!