<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數(shù)據(jù)庫連接池?

          共 8008字,需瀏覽 17分鐘

           ·

          2021-08-16 12:36


                一般我們的項目中會使用1到2個數(shù)據(jù)庫連接配置,同程藝龍的數(shù)據(jù)庫連接配置被收攏到統(tǒng)一的配置中心,由DBA統(tǒng)一維護,業(yè)務方通過某個配置字符串拿到的是開箱即用的Connection對象

               DBA能在對業(yè)務方無侵入的情況下,給業(yè)務方切換備份數(shù)據(jù)庫,之后DBA要求舊連接池必須立即被清空。

          那么問題來了: 不能立即清空.NET連接池?注意我用得是清空,而不是釋放連接。

          如果有同學不知道DBA做這個要求的目的,那我啰嗦一下:


          應用程序不再使用舊連接時,理論上你的連接池要被完全清空,因為單純的釋放連接,只會讓連接池中的Connection處于Sleep狀態(tài),依舊維持了短時間的物理連接,這個短時間其實是不必要的占用,影響了舊連接數(shù)據(jù)庫的吞吐量。


          連接池知識背景



          回答這個問題之前, 我們還是先研究一下.NET數(shù)據(jù)庫連接池。

          1. .NET數(shù)據(jù)庫連接池的背景

          數(shù)據(jù)庫連接是一個耗時的行為,大多數(shù)應用程序只使用1到幾種數(shù)據(jù)庫連接,為了最小化打開連接的成本,ado.net使用了一種稱為連接池的優(yōu)化技術(shù)。

          2. .NET 數(shù)據(jù)庫連接池的表現(xiàn)

          數(shù)據(jù)庫連接池減少了必須打開新連接的次數(shù),池程序維護了數(shù)據(jù)庫物理連接。

          通過為每個特定的連接配置保持一組活動的連接對象來管理連接。

          每當應用程序嘗試Open連接,池程序就會在池中找到可用的連接,如果有則返回給調(diào)用者;
          應用程序Close連接對象時,池程序?qū)⑦B接對象返回到池中(Sleep), 這個連接可以在下一次Open調(diào)用中重用。

          看黑板,下面是這次的重點:

          3. .NET是如何形成數(shù)據(jù)庫連接池的?

          只有相同的連接配置才能被池化,.NET為不同的配置維護了不同的連接池。

          相同的配置限制為:
          進程相同、
          連接字符串相同、
          連接字符串關鍵key順序相同。

          (連接字符串提供的關鍵字順序不同也將被分到不同的池)。

          連接池中的可用連接的數(shù)量由連接字符串Max Pool Size決定。

          在一個應用程序中,有如下代碼:

          using (SqlConnection connection = new SqlConnection(  
            "Integrated Security=SSPI;Initial Catalog=Northwind"))  
              {  
                  connection.Open();
                  // Pool A is created.  
              }  
            
          using (SqlConnection connection = new SqlConnection(  
            "Integrated Security=SSPI;Initial Catalog=pubs"))  
              {  
                  connection.Open();
                  // Pool B is created because the connection strings differ.  
              }  
            
          using (SqlConnection connection = new SqlConnection(  
            "Integrated Security=SSPI;Initial Catalog=Northwind"))  
              {  
                  connection.Open();
                  // The connection string matches pool A.  
              }  

          上面創(chuàng)建了三個Connection對象,但是只形成了兩個數(shù)據(jù)庫連接池

          還是以上代碼,如果有兩個相同的應用程序,理論上就形成了四個數(shù)據(jù)庫連接池。

          4. 連接池中的連接什么時候被移除?

          連接池中的連接空閑4-8 分鐘,池程序會移除這個連接。

          應用程序下線,連接池直接被清空。



          如何主動清空.NET連接池



          有了以上知識背景,我們再來回顧一下DBA的要求,切換數(shù)據(jù)庫連接配置的時候,清空原連接池。

           .NET提供了 ClearAllPools、ClearPool靜態(tài)方法用于清空連接池。

          ClearAllPools:      清空與這個DBProvider相關的所有連接池? ClearPool(DBConnection conn)      清空與這個連接對象相關的連接池

          很明顯,我們這次要使用ClearPool(DBConnection conn) 方法。

          光說不練不驗證,不是我的風格。

          天錘壓測/queryapi 產(chǎn)生一個包含大量連接對象的連接池;

          適當?shù)臅r候,調(diào)用/clearpoolapi清空連接池。

           public class MySqlController : Controller
              {
                  // GET: MySql
                  [Route("query")]
                  public string Index()
                  {
                      var s = "User ID=teinfra_neo_netreplay;Password=123456;DataBase=teinfra_neo_netreplay;Server=10.100.41.196;Port=3980;Min Pool Size=1;Max Pool Size=28;CharSet=utf8;";
                      using (var conn = new MySqlConnection(s))
                      {
                          var comm = conn.CreateCommand();
                          comm.CommandText = "select count(*) from usertest;";
                          conn.Open();
                          var ret = comm.ExecuteScalar();

                          comm.CommandText = "select count(*) from information_schema.PROCESSLIST WHERE HOST like  '10.22.12.245%';";
                          var len = comm.ExecuteScalar();
                          return $"查詢結(jié)果:{ret} ,順便查一下當前連接池的連接對象個數(shù): {len}";
                      };
                  }

                  [Route("clearpool")]
                  public string Switch()
                  {
                      var s = "User ID=teinfra_neo_netreplay;Password=123456;DataBase=teinfra_neo_netreplay;Server=10.100.41.196;Port=3980;Min Pool Size=1;Max Pool Size=28;CharSet=utf8;";
                      using (var conn = new MySqlConnection(s))
                      {
                          conn.Open();
                          MySqlConnection.ClearPool(conn);
                      };

                      using (var conn = new MySqlConnection(s))
                      {
                          conn.Open();
                          var comm = conn.CreateCommand();
                          comm.CommandText = "select count(*) from information_schema.PROCESSLIST WHERE HOST like  '10.22.12.245%';";
                          var len = comm.ExecuteScalar();
                          return $"之前已經(jīng)清空連接池, 此次查詢連接池有 {v1}  個連接對象";
                      }

                  }
              }

          1.壓測產(chǎn)生大量連接對象


          2. mysql數(shù)據(jù)庫對比

          mysql的連接數(shù)查詢命令: (host是web服務器IP):
          select * from information_schema.PROCESSLIST WHERE HOST like '10.22.12.245%';

            3.  調(diào)用/clearpoolapi,清空連接池

          bingo,清空連接池的理論得到驗證。


          旁白


          這是我在同程藝龍最近爬的比較深的坑位, 在本次實踐中我們了解到:

          ?.NET 數(shù)據(jù)庫連接池屬編程語言范疇,連接池維護了物理連接?.NET數(shù)據(jù)庫連接池的定義方式:(同一進程、同一連接字符串、同一連接字符串關鍵key順序一致) 被劃到一個池?DB客戶端查詢當前連接數(shù)的方式

          根據(jù)這個思路改造祖?zhèn)鞔a,.NET數(shù)據(jù)獲取組件SDK 已經(jīng)滿足了DBA的要求。

          希望本文設計考量、理論+論證的行文思路對讀者有所幫助, 距離上次發(fā)文一月有余,再次感謝5000+讀者不離不棄。

          引用鏈接

          [1] sql連接池(ado.net): https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

          btw 成都同程藝龍常年招收資深golang開發(fā)者,有機會參與企業(yè)級服務治理實踐。


          往期精彩回顧




          【推薦】.NET Core開發(fā)實戰(zhàn)視頻課程 ★★★

          .NET Core實戰(zhàn)項目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務實戰(zhàn)-統(tǒng)一身份認證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個接口多種實現(xiàn)的依賴注入與動態(tài)選擇看這篇就夠了

          10個小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時任務管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務輕松實現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說法:實際業(yè)務出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關于C#異步編程你應該了解的幾點建議

          C#異步編程看這篇就夠了


          瀏覽 53
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  国产香蕉一区二区三区 | 亚洲人成电影在线播放 | 看亚洲A级一级毛片 | 樱桃视频香蕉 | 黄色视频网站在线看 |