提升实体框架批量插入性能:策略和基准
高效地将大型数据集插入实体框架对于避免性能瓶颈至关重要。本文解决了在事务中插入 4000 条记录的挑战,这是一个容易出现不完整事务的场景。
避免频繁 SaveChanges()
通话的陷阱
主要的性能消耗源于对每条记录重复调用SaveChanges()
。 这种方法显着减慢了该过程。 以下是优化方法:
1。单个SaveChanges()
调用:添加所有记录后执行单个SaveChanges()
调用。
2。批量 SaveChanges()
调用: 批量插入记录(例如 100 或 1000),并在每批之后调用 SaveChanges()
。
3。使用批处理 SaveChanges()
进行上下文处置: 将批处理与在每次 SaveChanges()
调用后创建新的数据库上下文相结合。 这清除了上下文,进一步提高了性能。
优化的批量插入模式:
此代码说明了推荐的方法:
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { using (MyDbContext context = new MyDbContext()) { context.Configuration.AutoDetectChangesEnabled = false; int count = 0; int commitCount = 100; // Adjust as needed foreach (var entity in someCollection) { count++; context.Set<entity>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } context.SaveChanges(); } scope.Complete(); }</code>
性能分析:
使用 560,000 个实体(9 个标量属性)进行测试得出以下结果:
SaveChanges()
(提交计数 1): > 20分钟SaveChanges()
(提交计数 1000): 242 秒SaveChanges()
(提交计数 100): 164 秒结论:
通过避免频繁的 SaveChanges()
调用并利用上下文处理的批量插入,在实体框架批量插入中实现了显着的性能提升。这种优化最大限度地降低了事务超时的风险,并确保活动事务中的高效数据处理。
以上是如何优化实体框架中的批量插入以提高性能?的详细内容。更多信息请关注PHP中文网其他相关文章!