entity-framework - 工作单元如何与批处理一起使用?
问题描述
在构建 Web 应用程序时,标准做法是每个 HTTP 请求使用一个工作单元,并在处理请求后刷新所有更改并提交事务一次。
构建批处理时使用什么方法?一个工作单元实例是否用于整个流程的执行,并在逻辑点定期提交事务?
这可能更像是一个讨论而不是一个事实问题,但我希望找出是否存在类似于 Session-per-Request 的普遍接受的“最佳实践”。
解决方案
工作单元是您的业务交易。它是在范围上定义的ISession
。它应该更短;但不要太短。这就是为什么推荐使用 Session-Per-Request 的原因。有了这个,您可以利用各种 UoW 功能,如跟踪、一级缓存、自动刷新等。这可以避免一些往返数据库并提高性能。
对于像 Session-Per-Operation 这样的非常短ISession
的范围(根本没有 UoW),您会错过上面提到的所有这些好处。
随着 Session-Per-Application 或对非相关操作分组等不必要ISession
的范围增加,您会产生许多问题,例如无效的代理状态、内存使用量增加等。
考虑到上述情况,对于批处理,请尝试在您的批处理中识别较小的 UoW。如果您可以将批次分成小的 UoW 部分,请继续。如果您无法拆分批次,您有两种方法:
- 整个批次的单个
ISession
:
如果您的批次一遍又一遍地处理相同的记录,那么这可能很有用。通过延迟刷新,您将获得一些性能优势。
即使您的批处理只处理每条记录一次,由于减少了刷新并节省了到数据库的往返行程,这仍然可能受益。请参阅下面的第 2 点。 ISession
批处理中每个操作的新功能:
如果您的批处理只处理每个记录一次,那么这可能会更好。我不能肯定地说,因为完整的场景是未知的。
两者都有上面提到的缺点;最好尝试找出批次中较小的 UoW。
对于批量读取操作,IStatelessSession
是更好的解决方案。
推荐阅读
- git - 为什么 git describe 挑选出它所做的标签
- javascript - 来自 Google Recaptcha API 的间歇性 404 响应
- python - 计算列表中所有字符串长度总和的简单方法
- mysql - 无法使用 ssl 将 Google Data Studio 连接到 AWS RDS Aurora mysql
- javascript - 如何获取NodeList中的元素
- html - Flexbox,在不使用媒体查询的情况下填充宽度
- elasticsearch - ElasticSearch NEST DSL 查询 跨字段查询
- r - 我无法将库加载到 Rstudio
- python - 如何将 df.value_counts 与 csv 文件一起使用?
- azure - 在 Azure DevOps 中为 Nuget 部署安装 Mono