<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .NET使用EF批量插入數(shù)據(jù),一行代碼性能飆升!

          共 2003字,需瀏覽 5分鐘

           ·

          2023-09-06 21:22


          背景
          小編最近接到一個(gè)任務(wù),批量獲取內(nèi)部網(wǎng)站用TXT生成的日志,在閑時(shí)把日志插入到MySql數(shù)據(jù)庫(kù)做分析。為了快速開發(fā)小編選擇了Entity Framework Core,很快開發(fā)完成了。
          測(cè)試數(shù)據(jù)不是很多,批量插入數(shù)據(jù)很快完成,效率很高。但是部署到線上問題來了,最開始也挺快,越到后面越慢,慢的無法接受。于是查詢了一下官網(wǎng)和某度,只需加一句代碼就可以讓EF批量插入數(shù)據(jù)飆升。

          代碼示例

          開始的批量添加代碼

          public async void AddRangeAsync(List<T> entities)
          {
              await _dbContext.AddRangeAsync(entities);
              await _dbContext.SaveChangesAsync();
          }

          在以上方法增加一行,如下:

          public async void AddRangeAsync(List<T> entities)
          {
              //批量添加需要將AutoDetectChangesEnabled給位false
              _dbContext.ChangeTracker.AutoDetectChangesEnabled = false;
              await _dbContext.AddRangeAsync(entities);
              await _dbContext.SaveChangesAsync();
          }

          原理

          微軟的解釋:AutoDetectChangesEnabled默認(rèn)值為 true。這可確保上下文在執(zhí)行操作(例如 SaveChanges() 或返回更改跟蹤信息)之前了解對(duì)跟蹤實(shí)體實(shí)例所做的任何更改。如果禁用自動(dòng)檢測(cè)更改, DetectChanges() 則必須確保在修改實(shí)體實(shí)例時(shí)調(diào)用 。

          如果不這樣做,可能會(huì)導(dǎo)致某些更改在返回或返回過時(shí)的更改跟蹤信息期間 SaveChanges() 無法持久保存。

          這是啥意思呢?ChangeTracker的AutoDetectChangesEnabled屬性是Entity Framework中的一個(gè)屬性,用于控制是否自動(dòng)檢測(cè)實(shí)體的更改。

          默認(rèn)情況下,AutoDetectChangesEnabled屬性的值為true,即自動(dòng)檢測(cè)更改。每次對(duì)實(shí)體進(jìn)行更改(添加、刪除、更新)時(shí),Entity Framework會(huì)自動(dòng)檢測(cè)這些更改,并將其標(biāo)記為“已更改”。這樣,在調(diào)用SaveChanges方法時(shí),Entity Framework會(huì)自動(dòng)將這些更改應(yīng)用到數(shù)據(jù)庫(kù)中。

          當(dāng)AutoDetectChangesEnabled屬性的值為true時(shí),將對(duì)EF的性能造成一定的影響,尤其是批量插入數(shù)據(jù)。

          對(duì)于插入操作,無論AutoDetectChangesEnabled的值為true還是false,都可以成功插入數(shù)據(jù)。因?yàn)椴迦氩僮鞅旧砭褪且环N新增操作,無需進(jìn)行實(shí)體的更改檢測(cè)。所以在批量插入時(shí),建議把AutoDetectChangesEnabled設(shè)置為false。

          設(shè)置為false具體對(duì)操作的數(shù)據(jù)有沒有影響呢?

          答案是肯定的,分情況。如果插入數(shù)據(jù)后有上下文操作,那么上下文不會(huì)自動(dòng)更新實(shí)體的狀態(tài),如果沒有后續(xù)操作可以忽略。

          這就需要手動(dòng)調(diào)用DetectChanges方法或?qū)?shí)體狀態(tài)設(shè)置為“已更改”才能使上下文與數(shù)據(jù)庫(kù)同步。

          建議批量插入數(shù)據(jù)結(jié)束時(shí),把AutoDetectChangesEnabled的值改為true。

          結(jié)語(yǔ)

          本文講述了.NET用EF批量插入數(shù)據(jù),改進(jìn)性能的簡(jiǎn)單方法。

          當(dāng)然還有很多方法,比如可以使用EF批量添加擴(kuò)展,可以在EF中執(zhí)行SQL插入語(yǔ)句,還可以用EF執(zhí)行存儲(chǔ)過程的方式批量添加(SQL Server實(shí)驗(yàn)過,MySql未實(shí)驗(yàn))等,大家還有啥好方法可以留言。

          日志分析建議大家用mangodb或者ES等數(shù)據(jù)庫(kù),本案例只是臨時(shí)數(shù)據(jù)分析。希望本文對(duì)你有所收獲,歡迎留言或者吐槽。

          轉(zhuǎn)自:翔星

          鏈接:cnblogs.com/xbhp/p/17540769.html

          瀏覽 329
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色视频大全在线观看 | 亚洲第一综合区 | 影音先锋五月天 | 天天天天天操 | 香蕉视频毛片 |