问题:
在使用 TransactionScope 进行事务处理时,如何快速地将 4000 多条记录批量插入到数据库中?
答案:
对于大量数据插入 (4000 条记录),逐条调用 SaveChanges()
方法效率极低。以下优化技术可以显着提高插入速度:
SaveChanges()
: 在所有记录都添加到上下文后,一次性调用 SaveChanges()
。 SaveChanges()
: 处理指定数量的记录后 (例如,100 条),调用一次 SaveChanges()
。 SaveChanges()
后重建上下文: 类似于分批方法,但在 SaveChanges()
后释放上下文并创建一个新的上下文,以释放已附加的实体。 Configuration.AutoDetectChangesEnabled
设置为 false
。 实现示例:
以下代码片段结合了上述优化技术:
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { MyDbContext context = null; try { context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; int count = 0; foreach (var entityToInsert in someCollectionOfEntitiesToInsert) { ++count; context = AddToContext(context, entityToInsert, count, 100, true); } context.SaveChanges(); } finally { if (context != null) context.Dispose(); } scope.Complete(); } private MyDbContext AddToContext(MyDbContext context, Entity entity, int count, int commitCount, bool recreateContext) { context.Set<Entity>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); if (recreateContext) { context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } return context; }</code>
此模式通过在调用 SaveChanges()
之前处理多条记录来实现批量插入。此外,在 SaveChanges()
后释放并重新创建上下文有助于清除已附加的实体,从而减少内存使用并提高性能。
性能对比:
使用此优化模式将 560,000 个实体插入数据库的性能测试结果:
commitCount = 10000
, recreateContext = false
: 202 秒commitCount = 100
, recreateContext = true
: 164 秒相比之下,如果对每条记录都调用 SaveChanges()
,则完成相同操作将需要数小时。
以上是在TransactionsCope中使用实体框架将4000记录插入数据库中的最快方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!