EF7DbContext池

来源:https://www.cnblogs.com/YataoFeng/archive/2023/03/05/17181508.html
-Advertisement-
Play Games

序言 閑來無聊,前段時間發現一個.net開源框架:masa framework。經過一些小型項目使用,發現確實挺不錯的。然後我又去閱讀了整個masa framework源碼,特此來記錄整個源碼閱讀的過程。 如有錯誤之處還請指點 MASA Framework簡介 ​ Masa Framework是 m ...


為什麼使用DbContext池?

DbContext是Entity Framework中最重要的類型之一,它提供了一種連接資料庫並執行查詢和更新的方式。在一個ASP.NET Core應用程式中,每次請求都可能需要對資料庫進行一次或多次查詢。在這種情況下,為每個請求創建新的DbContext實例並不是一個好的選擇,因為這樣做可能會導致記憶體和性能問題。
DbContext池允許應用程式在需要時重用已經創建的DbContext實例,從而提高性能並減少記憶體消耗。
性能基準

DbContext池的工作原理

DbContext池是一個對象池,它維護一組可用的DbContext實例,這些實例是預先創建好的,緩存在池子中。當應用程式需要一個新的DbContext實例時,它可以從池子中獲取一個已有的實例,使用完後再將其釋放回池子中,以供下一次使用。
DbContext池的大小是由應用程式的配置來控制的。預設情況下,DbContext池的大小是1024,但是我們也可以通過代碼進行手動配置。例如,我們可以使用以下代碼手動配置DbContext池的大小:

Services.AddDbContextPool<DbContext>(options => options.UseSqlServer(""), poolSize: 10);

在這裡,我們將DbContext池的大小設置為10個實例。
超過poolSize會怎麼樣?

微軟官網:一旦超過 poolSize,就不會緩存新的上下文實例,EF 會回退到按需創建實例的非池行為。

DbContext池中每個DbContext的生命周期

每個DbContext實例代表了應用程式與資料庫的會話(Session),池中每個DbContext實例的生命周期與依賴註入時的聲明周期有關,預設DbContext是以範圍生命周期(Scope)註冊服務的(這是最佳的方式)。

微軟官網:Entity Framework Core 不支持在同一 DbContext 實例上運行多個並行操作。 這包括非同步查詢的並行執行以及從多個線程進行的任何顯式併發使用。 因此,始終立即 await 非同步調用,或對並行執行的操作使用單獨的 DbContext 實例。

釋放DbContext池中的DbContext

官方推薦使用自定義上下文工廠:看文檔(管理共用上下文中的狀態)這裡與文檔衝突,我就不說了。

總結

DbContext池是為了提高性能而引入的概念。它可以緩存DbContext實例,避免了創建和銷毀DbContext實例的開銷,同時還可以減輕資料庫的負擔。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Whay need the CMake? 如果只是構建一個只有一個main.cpp的小型項目,那麼確實不需要CMake, 直接GCC、G++編譯,或者寫個build.sh腳本即可, 不需要把簡單的問題搞複雜化。 $ g++ main.cpp -o cmake_hello 但是如果你的項目分了很多模塊 ...
  • 使用記憶體對齊機制優化結構體性能,妙啊! 可以簡單理解為:將對齊繫數小的欄位,儘可能放在一起,儘量減少空白填充。 掌握了記憶體對齊機制後,結構體Struct的優化,調整下欄位順序,效果立竿見影。記憶體對齊其實就是典型的空間換時間的方式,來達到優化的目的。牢記對齊原則,對實際場景進行分析,減少空白填充。 ...
  • 昨天在群里看到有小伙伴問,Java里如何解析SQL語句然後格式化SQL,是否有現成類庫可以使用? 之前TJ沒有做過這類需求,所以去研究了一下,並找到了一個不過的解決方案,今天推薦給大家,如果您正要做類似內容,那就拿來試試,如果暫時沒需求,就先瞭解收藏(技多不壓身)。 JSqlParser JSqlP ...
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址:https://github.c ...
  • 自動化測試環境的搭建 :一、安裝 selenium: 安裝方式一: pip install -U selenium 安裝方式二: 手動安裝 selenium: 1、安裝python包,選擇全部組件(pip、安裝過程中配置環境變數)解壓selenium-4.8.2.tar.gz,然後用cmd進入解壓目 ...
  • 代碼覆蓋率(Code coverage)是指在軟體測試中測試用例執行時覆蓋的代碼量與總代碼量的比例。代碼覆蓋率是軟體測試中一個重要的指標,它對於保障軟體質量、提高軟體可靠性和可維護性具有許多好處:發現代碼缺陷、提高代碼的可維護性、確保代碼的正確性和優化測試用例質量等。 我們常用的 IDE,Visua ...
  • Github Actions 是 Github 提供的一種持續集成(CI)和持續部署(CD)工具,可以自動化代碼開發、測試、構建和部署的過程。它可以在代碼倉庫中通過配置文件來定義工作流程(Workflow),包括觸發事件、執行任務和處理結果等。這些工作流程可以與Github倉庫的其他功能(如Issu ...
  • 【開門見山】 實現目標: 需要讓歌詞列表隨著播放的時間更新而滾動,即實時的跟隨歌曲的進度而滾動 效果: ​編輯 需要事先準備的東西: 1.音頻(mp3格式): ​編輯 2.歌詞(詳細): ​編輯 先展示html和css的實現(不重要,自己想怎樣調都行,重點在js的邏輯實現) 1.html: 小tip ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...