問題:
在使用 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中文網其他相關文章!