0

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

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

即它是所有东西的OSIV,还是只有某些请求通过整个过滤器链绑定会话,然后控制器/服务再退出?

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

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

任何澄清都会很棒!

Vlad Mihalcea - OSIV 反模式

Baeldung - OSIV

4

1 回答 1

2

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

于 2021-09-06T14:23:10.093 回答