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 - 每个请求/线程都会发生这种情况吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Grails 时我应该关心 Open Session in View 吗?
ssh整合,从hibernate那个版本开始需要open session in view 才能开启事务?
Spring boot 解决 hibernate no session异常