我已经在 Spring 项目中关闭了 OSIV,因为我一直在阅读为什么它(有争议地)可能有点反模式。不想戳那个辩论,因为我已经看到它变得激烈,但我对技术更感兴趣/迷失了。
无论哪种方式,我都想知道会话何时打开?是针对任何传入的 Web 请求,还是应用程序知道它只需要针对某些端点的会话?我猜OSIV Filter
基本上总是为每个请求调用,并且获取到数据库的休眠会话并将其添加到 webrequest/thread 中?
即它是所有东西的OSIV,还是只有某些请求通过整个过滤器链绑定会话,然后控制器/服务再退出?
当他们说“会话”时,我正确地假设这意味着它已经获得了一个活动的 jdbc 连接并打开了与数据库的连接......即使我可能不使用它,这就是可能发生阻塞 IO 问题的地方说如果我们正在等待 3rd 方的响应,尽管我们现在超出了@Transactional
服务方法边界并且我们得到了流量高峰?
究竟什么是明智的开放会话?是否通过会话“以防万一”在每个请求上启动数据库事务?或者是否只为每个请求创建了一个休眠会话,然后只有在沿着请求的某处启动 JPA/Hibernate 查询(有或没有)时才启动事务@Transactional
。
任何澄清都会很棒!