EntityFramework Core進行讀寫分離最佳實踐方式,了解一下(二)?

      網友投稿 923 2022-05-30

      EF Core讀寫分離進一步完善

      如評論前輩們指出在EF 6.x中我們知道有IDbCommandInterceptor接口,我們可對執行的SQL語句進行攔截,從而可自定義實現我們想要的需求,雖然在EF Core中卻沒有-特性的實現,但是針對此特性的實現DiagnosticSource記錄跟蹤類來實現等效于-的實現,當前DiagnosticSource使用文檔尚未完善,估計還得等待一段時間,接下來我們來看看如何實現。在DiagnosticSource包中有DiagnosticListener類,我們通過此類來跟蹤記錄,如果執行的EF Core包,那么我們將利用DiagnosticListener進行訂閱,訂閱到之后我們拿到跟蹤命令,從而實現無感知更換數據庫,代碼如下:

      public?class?DbCommandInterceptor?:?IObserver> ????{????????private?const?string?masterConnectionString?=?"data?source=WANGPENG;User?Id=sa;Pwd=sa123;initial?catalog=Demo1;integrated?security=True;";????????private?const?string?slaveConnectionString?=?"data?source=WANGPENG;User?Id=sa;Pwd=sa123;initial?catalog=Demo2;integrated?security=True;";????????public?void?OnCompleted() ????????{ ????????}????????public?void?replaceString(Exception?error) ????????{ ????????}????????public?void?OnNext(KeyValuePair?value) ????????{????????????if?(value.Key?==?RelationalEventId.CommandExecuting.Name) ????????????{????????????????var?command?=?((CommandEventData)value.Value).Command;????????????????var?executeMethod?=?((CommandEventData)value.Value).ExecuteMethod;????????????????if?(executeMethod?==?DbCommandMethod.ExecuteNonQuery) ????????????????{ ????????????????????ResetConnection(command,?masterConnectionString); ????????????????}????????????????else?if?(executeMethod?==?DbCommandMethod.ExecuteScalar) ????????????????{ ????????????????????ResetConnection(command,?slaveConnectionString); ????????????????}????????????????else?if?(executeMethod?==?DbCommandMethod.ExecuteReader) ????????????????{ ????????????????????ResetConnection(command,?slaveConnectionString); ????????????????} ????????????} ????????}????????void?ResetConnection(DbCommand?command,?string?connectionString) ????????{????????????if?(command.Connection.State?==?ConnectionState.Open) ????????????{????????????????if?(!command.CommandText.Contains("@@ROWCOUNT")) ????????????????{ ????????????????????command.Connection.Close(); ????????????????????command.Connection.ConnectionString?=?connectionString; ????????????????} ????????????}????????????if?(command.Connection.State?==?ConnectionState.Closed) ????????????{ ????????????????command.Connection.Open(); ????????????} ????????} ????}

      這里存在一個問題,上述?command.CommandText.Contains("@@ROWCOUNT")?代碼,因為在進行添加操作時,會返回主鍵,那么此時會進行查詢,所以暫時沒有更好的方式是確認主-從數據庫。

      public?class?CommandListener?:?IObserver ????{????????private?readonly?DbCommandInterceptor?_dbCommandInterceptor?=?new?DbCommandInterceptor();????????public?void?OnCompleted() ????????{ ????????}????????public?void?replaceString(Exception?error) ????????{ ????????}????????public?void?OnNext(DiagnosticListener?listener) ????????{? ????????????if?(listener.Name?==?DbLoggerCategory.Name) ????????????{ ????????????????listener.Subscribe(_dbCommandInterceptor); ????????????} ????????} ????}

      上述?DbLoggerCategory.Name?也就是?Microsoft.EntityFrameworkCore?,通過監控的包是Microsoft.EntityFrameworkCore,則進行訂閱,最后我們在startup中進行注冊該監聽類。

      DiagnosticListener.AllListeners.Subscribe(new?CommandListener());

      接下來我們通過動態圖來看看最終實際效果,主-從復制依然是通過SQL Server發布-訂閱的方式來同步數據。在控制器中,我們只利用demo1上下文來添加和查詢數據,當查詢時更換到從數據庫,此時已是無感知(請見上一篇),如下:

      EntityFramework Core進行讀寫分離最佳實踐方式,了解一下(二)?

      [HttpGet("index")]????????public?IActionResult?Index() ????????{????????????var?blogs?=?_demo1DbContext.Blogs.ToList();????????????return?View(blogs); ????????} ????????[HttpGet("create")]????????public?IActionResult?CreateDemo1Blog() ????????{????????????var?blog?=?new?Blog() ????????????{ ????????????????Name?=?"demoBlog1", ????????????????Url?=?"http://www.cnblogs.com/createmyslef" ????????????}; ????????????_demo1DbContext.Blogs.Add(blog); ????????????_demo1DbContext.SaveChanges();????????????return?RedirectToAction(nameof(Index)); ????????}

      總結

      本文只是在上一篇的基礎上進一步改善了讀寫分離的操作,得益于github上有提出可通過跟蹤記錄來解決,通過跟蹤記錄從底層出發來完善讀寫分離操作,我們可拿到底層實現的命令以及其他和EF 6.x中利用-等效,至于更加復雜的邏輯可自行實現。

      數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:華為Atlas 200DK初體驗——寫在昇騰新品發布的第二天
      下一篇:[經驗]解決使用opencv 高分辨率下的攝像頭卡頓不流暢
      相關文章
      亚洲精品国偷自产在线| 色噜噜亚洲男人的天堂| 亚洲熟女精品中文字幕| 亚洲欧洲尹人香蕉综合| 亚洲精品自产拍在线观看动漫| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲日韩人妻第一页| 亚洲国产精品一区二区九九 | 亚洲欧洲在线观看| 精品国产综合成人亚洲区| 国产亚洲一区二区三区在线不卡| 亚洲真人日本在线| 国产精品亚洲综合一区| 国产啪亚洲国产精品无码 | 亚洲无圣光一区二区| 亚洲成综合人影院在院播放| 亚洲午夜国产精品| 亚洲国产午夜精品理论片| 亚洲中文字幕久在线| 国产亚洲玖玖玖在线观看| 亚洲乱码中文字幕在线| MM1313亚洲国产精品| 妇女自拍偷自拍亚洲精品| 亚洲国产一区二区三区| 在线观看亚洲av每日更新| 亚洲高清专区日韩精品| 久久精品a亚洲国产v高清不卡| 亚洲毛片免费视频| 精品亚洲AV无码一区二区三区 | 亚洲色爱图小说专区| 精品国产亚洲一区二区三区| 亚洲视频在线视频| 亚洲成aⅴ人在线观看| 亚洲一卡2卡3卡4卡乱码 在线| 亚洲精品国产高清在线观看| 亚洲精品岛国片在线观看| 亚洲最大AV网站在线观看| 亚洲国产综合专区电影在线| 亚洲国产精品综合久久网各| 亚洲午夜精品一区二区麻豆| 亚洲AV中文无码乱人伦|