首页 > 解决方案 > 工作单元如何与批处理一起使用?

问题描述

在构建 Web 应用程序时,标准做法是每个 HTTP 请求使用一个工作单元,并在处理请求后刷新所有更改并提交事务一次。

构建批处理时使用什么方法?一个工作单元实例是否用于整个流程的执行,并在逻辑点定期提交事务?

这可能更像是一个讨论而不是一个事实问题,但我希望找出是否存在类似于 Session-per-Request 的普遍接受的“最佳实践”。

标签: entity-frameworknhibernateormbatch-processingunit-of-work

解决方案


工作单元是您的业务交易。它是在范围上定义的ISession。它应该更短;但不要太短。这就是为什么推荐使用 Session-Per-Request 的原因。有了这个,您可以利用各种 UoW 功能,如跟踪、一级缓存、自动刷新等。这可以避免一些往返数据库并提高性能。

对于像 Session-Per-Operation 这样的非常短ISession的范围(根本没有 UoW),您会错过上面提到的所有这些好处。

随着 Session-Per-Application 或对非相关操作分组等不必要ISession的范围增加,您会产生许多问题,例如无效的代理状态、内存使用量增加等。

考虑到上述情况,对于批处理,请尝试在您的批处理中识别较小的 UoW。如果您可以将批次分成小的 UoW 部分,请继续。如果您无法拆分批次,您有两种方法:

  1. 整个批次的单个ISession
    如果您的批次一遍又一遍地处理相同的记录,那么这可能很有用。通过延迟刷新,您将获得一些性能优势。
    即使您的批处理只处理每条记录一次,由于减少了刷新并节省了到数据库的往返行程,这仍然可能受益。请参阅下面的第 2 点。
  2. ISession批处理中每个操作的新功能:
    如果您的批处理只处理每个记录一次,那么这可能会更好。我不能肯定地说,因为完整的场景是未知的。

两者都有上面提到的缺点;最好尝试找出批次中较小的 UoW。

对于批量读取操作,IStatelessSession是更好的解决方案。


推荐阅读