Open Session In View OSIV - 每个请求/线程都会发生这种情况吗?
Open Session In View OSIV - Does this happen for every request / thread?
我已经在一个 Spring 项目中关闭了 OSIV,因为我一直在阅读为什么它(有争议地)可能有点反模式。我不想挑起那场辩论,因为我看到它变得激烈,但我更 interested/lost 在技术方面。
无论如何,我想知道会话何时打开?是针对传入的任何 Web 请求,还是应用程序以某种方式知道它只需要针对某些端点的会话?我猜 OSIV Filter
基本上总是为每个请求调用,并且获取数据库的休眠会话并将其添加到 webrequest/thread?
即是针对所有内容还是仅某些请求通过 OSIV 获取会话绑定
整个过滤器链,然后 controller/services 并退出?
当他们说“会话”时,我的假设是正确的,这意味着它已经获得了一个活动的 jdbc 连接并打开了与数据库的连接......即使我可能不会使用它,也就是在那里如果我们正在等待第 3 方响应,尽管我们现在超出了 @Transactional
服务方法边界并且流量激增,但可能会出现这种阻塞 IO 问题?
open session wise 到底是什么?数据库事务是否在每次请求时“以防万一”通过会话启动?或者是否只为每个请求创建一个休眠会话,然后只有在请求的某处启动 JPA/Hibernate 查询时才启动事务(有或没有 @Transactional
)。
任何澄清都将是极好的!
仅当您 运行 使用 @Transactional
注释的方法时才会启动事务。 OSIV 只是热切地 opens/creates 一个 Hibernate 会话,它可以在整个请求生命周期中用于延迟加载,但连接只是延迟获取,即在第一次数据库访问时。获取后,取决于某些设置何时释放连接,但通常它会一直保持打开状态,直到会话关闭。
我已经在一个 Spring 项目中关闭了 OSIV,因为我一直在阅读为什么它(有争议地)可能有点反模式。我不想挑起那场辩论,因为我看到它变得激烈,但我更 interested/lost 在技术方面。
无论如何,我想知道会话何时打开?是针对传入的任何 Web 请求,还是应用程序以某种方式知道它只需要针对某些端点的会话?我猜 OSIV Filter
基本上总是为每个请求调用,并且获取数据库的休眠会话并将其添加到 webrequest/thread?
即是针对所有内容还是仅某些请求通过 OSIV 获取会话绑定 整个过滤器链,然后 controller/services 并退出?
当他们说“会话”时,我的假设是正确的,这意味着它已经获得了一个活动的 jdbc 连接并打开了与数据库的连接......即使我可能不会使用它,也就是在那里如果我们正在等待第 3 方响应,尽管我们现在超出了 @Transactional
服务方法边界并且流量激增,但可能会出现这种阻塞 IO 问题?
open session wise 到底是什么?数据库事务是否在每次请求时“以防万一”通过会话启动?或者是否只为每个请求创建一个休眠会话,然后只有在请求的某处启动 JPA/Hibernate 查询时才启动事务(有或没有 @Transactional
)。
任何澄清都将是极好的!
仅当您 运行 使用 @Transactional
注释的方法时才会启动事务。 OSIV 只是热切地 opens/creates 一个 Hibernate 会话,它可以在整个请求生命周期中用于延迟加载,但连接只是延迟获取,即在第一次数据库访问时。获取后,取决于某些设置何时释放连接,但通常它会一直保持打开状态,直到会话关闭。