Open Session In View OSIV - 每个请求/线程都会发生这种情况吗?

Posted

技术标签:

【中文标题】Open Session In View OSIV - 每个请求/线程都会发生这种情况吗?【英文标题】:Open Session In View OSIV - Does this happen for every request / thread? 【发布时间】:2021-10-22 08:46:06 【问题描述】:

我已经在 Spring 项目中关闭了 OSIV,因为我一直在阅读为什么它(有争议地)可能有点反模式。不想挑起那场辩论,因为我看到它变得激烈,但我对技术更感兴趣/迷失了。

无论哪种方式,我都想知道会话何时打开?是针对传入的任何 Web 请求,还是应用程序知道它只需要针对某些端点的会话?我猜OSIV Filter 基本上总是为每个请求调用,并且获取到数据库的休眠会话并将其添加到 webrequest/thread 中?

即是所有内容的 OSIV 还是只有某些请求通过 整个过滤器链,然后是控制器/服务并退出?

当他们说“会话”时,我正确地假设这意味着它已经获得了一个活动的 jdbc 连接并打开了与数据库的连接......即使我可能不会使用它,这就是阻塞 IO 问题的地方虽然我们现在超出了@Transactional 服务方法边界并且我们得到了流量高峰,但如果我们正在等待第 3 方响应,可能会发生这种情况?

究竟什么是明智的打开会话?是否通过会话“以防万一”在每个请求上启动数据库事务?或者是否只是为每个请求创建了一个休眠会话,然后只有在请求的某处启动 JPA/Hibernate 查询时才启动事务(有或没有@Transactional)。

任何澄清都会很好!

Vlad Mihalcea - OSIV Anti-Pattern

Baeldung - OSIV

【问题讨论】:

【参考方案1】:

只有在您运行带有@Transactional 注释的方法时才会启动事务。 OSIV 只是急切地打开/创建一个 Hibernate 会话,该会话可用于在整个请求生命周期中进行延迟加载,但连接只是延迟获取,即在第一次访问数据库时。一旦被获取,它取决于某些设置何时释放连接,但通常保持打开状态直到会话关闭。

【讨论】:

以上是关于Open Session In View OSIV - 每个请求/线程都会发生这种情况吗?的主要内容,如果未能解决你的问题,请参考以下文章

open Session In View和过滤器配置

使用 Grails 时我应该关心 Open Session in View 吗?

ssh整合,从hibernate那个版本开始需要open session in view 才能开启事务?

Spring boot 解决 hibernate no session异常

SpringBoot 使用JPA时解决no session的方法

去掉WARN spring.jpa.open-in-view is enabled by default