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