EF Core 异步编程注意要点
????歡迎點贊 :???? 收藏 ?留言 ???? 如有錯誤敬請指正,賜人玫瑰,手留余香!
????本文作者:由webmote 原創,
????作者格言:生活在于折騰,當你不折騰生活時,生活就開始折騰你,讓我們一起加油!????????????
???? 序言
不得不說,異步和線程性能問題一直是高并發的大敵。
而.net core 自從誕生就不斷地提升性能,目前的.net 6有一部分也是專門在優化性能方面的開銷,而最近我閱讀EF Core的 RoadMap時,也欣喜的發現這個由小團隊維護的類庫,也開始逐步為性能的提升做出改變。
EF Core團隊特別是有一段話令人驚喜:他們將對標DapperLib庫優化性能,并隨.net 6一起發布。
???? 01.EF Core 不支持在同一上下文實例上運行多個并行操作
EF Core 不支持在同一上下文實例上運行多個并行操作。應始終等待操作完成,然后再開始下一個操作。這通常是通過在每個異步操作上使用?await?關鍵字完成的。
因此不要自作聰明 不使用await ,放任操作自己執行,寄希望于異步不影響主線程。
???? 02. 服務端與客戶端異步 LINQ 運算符
為了支持異步執行 LINQ 查詢,Microsoft.EntityFrameworkCore?命名空間中定義 EF Core 異步擴展方法。
EF Core 提供了一組異步擴展方法,這些方法執行查詢并返回結果。這些對應于標準的同步 LINQ 運算符包括 ToListAsync、SingleAsync、AsAsyncEnumerable 等:
服務端異步 LINQ 運算符只能在 EF 查詢上使用,不能將其與客戶端 LINQ to Objects 查詢一起使用。若要在 EF 之外執行客戶端異步 LINQ 操作,請使用 system.exception 包;此包對于在客戶端上執行無法在服務器上進行求值的操作時特別有用。
遺憾的是,引用 system.exception 和服務端 LINQ 運算符上出現不明確的調用編譯錯誤;這使得難以在同一項目中使用 EF 和 System.object。若要解決此問題,請將 AsQueryable 添加到 DbSet:
var groupedHighlyRatedBlogs = await context.Blogs.AsQueryable().Where(b => b.Rating > 3) // server-evaluated.AsAsyncEnumerable().GroupBy(b => b.Rating) // client-evaluated.ToListAsync();???? 03. 并行異步數據庫連接方法慢或阻塞
如果最小并發池子數沒被設置,則會導致異步連接變慢,同步連接幾乎不受影響,因此,默認構建sql連接字符串時,增加最小池子數參數。
添加一個MinPoolSize為100的連接字符串。如果你加的數字大于100,你需要改變MaxPoolSize,因為其默認值為100,且不能小于MinPoolSize的值。
對于池連接,請在你的連接字符串中添加Pooling=true,在你的非池連接中添加Pooling=false
???? 04. 異步讀取大數據(二進制,文本,圖片)非常慢
異步讀取10MB的VARBINARY(MAX)值大約需要5秒,而同步讀取相同的值大約需要20毫秒。將數據大小增加到20MB將使運行時間增加到大約52秒。
是的,這個問題,目前還沒有解決,其涉及到 Zero Copy問題以及其他的一些線程協調問題,因此,估計Ef Core 6之前是不可能被解決的,因此最好的方案是?暫時使用同步方法。
???? 05.連接池到底設置多大?
嚴格來說,這不是EF的問題,數據庫連接池是client方面的事情,不過也是困惑我很久的問題,這里給出答案。
參考值:?連接數 = ((核心數 * 2) + 有效磁盤數)
這一公式不僅適用于數據庫連接池的計算,大部分涉及計算和I/O的程序,線程數的設置都可以參考這一公式。
因此微軟默認的池子數是10-100。而由于對線程的管理不善,我們的應用一般會設置 100-1000左右,哈哈,這就是控制的差距。
我們經常見到一些小規模的web應用,應付著大約十來個的并發用戶,卻使用著一個100連接數的連接池。這會對你的數據庫造成極其不必要的負擔。
???? 06. 小結
晚上有事情,只能上班的時候抽空總結下。
養成一個好習慣,需要不停的激勵和鼓勵,寫作的能力也許就是不斷的寫中提升的,當然還有自身的額能力,在不斷的輸出過程中,發現自己的不足以及鞏固自己的知識。
30天不停更,目標很遠大,加油!
例行小結,理性看待!
結的是啥啊,結的是我想你點贊而不可得的寂寞。????????????
????都看到這了,還在乎點個贊嗎?
????都點贊了,還在乎一個收藏嗎?
????都收藏了,還在乎一個評論嗎?
總結
以上是生活随笔為你收集整理的EF Core 异步编程注意要点的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 聊聊编程语言的选择
 - 下一篇: 为什么应该用record来定义DTO(续