亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Ado.net的連接池

系統(tǒng) 1647 0

本篇文章起源于在GCR MVP Open Day的時(shí)候和C# MVP張響討論連接池的概念而來的。因此單獨(dú)寫一篇文章剖析一下連接池。

為什么需要連接池

剖析一個(gè)技術(shù)第一個(gè)要問的是,這項(xiàng)技術(shù)為什么存在。

對于每一個(gè)到SQL Server的連接,都需要經(jīng)歷TCP/IP協(xié)議的三次握手,身份認(rèn)證,在SQL Server里建立連接,分配資源等。而當(dāng)客戶端關(guān)閉連接時(shí),客戶端就會(huì)和SQL Server終止物理連接。但是,我們做過數(shù)據(jù)庫開發(fā)的人都知道,每次操作完后關(guān)閉連接是再正常不過的事了,一個(gè)應(yīng)用程序即使在負(fù)載不大的情況下也需要不停的連接SQL Server和關(guān)閉連接,同一個(gè)應(yīng)用程序同時(shí)也可能存在多個(gè)連接。

因此,如果不斷的這樣建立和關(guān)閉連接,會(huì)是非常浪費(fèi)資源的做法。因此Ado.net中存在連接池這種機(jī)制。在對SQL Server來說的客戶端的應(yīng)用程序進(jìn)程中維護(hù)連接池。統(tǒng)一管理Ado.net和SQL Server的連接,既連接池保持和SQL Server的連接,當(dāng)Connection.Open()時(shí),僅僅從連接池中分配一個(gè)已經(jīng)和SQL Server建立的連接,當(dāng)Connection.Close()時(shí),也并不是和SQL Server物理斷開連接,僅僅是將連接進(jìn)行回收。

因此,連接池總是能維護(hù)一定數(shù)量的和SQL Server的連接,以便應(yīng)用程序反復(fù)使用這些連接以減少性能損耗。

重置連接的sys.sp_reset_connection

連接是有上下文的,比如說當(dāng)前連接有未提交的事務(wù),存在可用的游標(biāo),存在對應(yīng)的臨時(shí)表。因此為了便于連接重復(fù)使用,使得下一個(gè)連接不會(huì)收到上一個(gè)連接的影響,SQL Server通過sys.sp_reset_connection來清除當(dāng)前連接的上下文,以便另一個(gè)連接繼續(xù)使用。

當(dāng)在Ado.net中調(diào)用了Connection.Close()時(shí),會(huì)觸發(fā)sys.sp_reset_connection。這個(gè)系統(tǒng)存儲(chǔ)過程大概會(huì)做如下事情:

  • 關(guān)閉游標(biāo)
  • 清除臨時(shí)對象,比如臨時(shí)表
  • 釋放鎖
  • 重置Set選項(xiàng)
  • 重置統(tǒng)計(jì)信息
  • 回滾未提交的事務(wù)
  • 切換到連接的默認(rèn)數(shù)據(jù)庫
  • 重置Trace Flag

此外,根據(jù)BOL上的信息:

       "The sp_reset_connection stored procedure is used by SQL 
Server to support remote stored procedure calls in a transaction. This stored 
procedure also causes Audit Login and Audit Logout events to fire when a 
connection is reused from a connection pool."
    

可以知道不能顯式的在SQL Server中調(diào)用sys.sp_reset_connection,此外,這個(gè)方法還會(huì)觸發(fā)Audit Login和Audit Logout事件。

一個(gè)簡單的示例

下面我們通過一個(gè)簡單的示例來看連接池的使用:

首先我分別使用四個(gè)連接,其中第一個(gè)和第二個(gè)連接之間有10秒的等待時(shí)間:

      String ConnectionString = "
      
        data source=.\\sql2012;database=AdventureWorks;uid=sa;pwd=sasasa
      
      ";
        SqlConnection cn1=new SqlConnection(ConnectionString);
        SqlCommand cmd1=cn1.CreateCommand();
        cmd1.CommandText="
      
        SELECT * FROM dbo.ABCD
      
      ";
        cn1.
      
        Open
      
      ();
        cmd1.ExecuteReader();
        cn1.
      
        Close
      
      ();
        Response.
      
        Write
      
      ("
      
        連接關(guān)閉時(shí)間:
      
      "+
      
        DateTime
      
      .Now.ToLongTimeString()+"
      
        <br />
      
      ");
        
        System.Threading.Thread.Sleep(10000);

          SqlConnection cn2=new SqlConnection(ConnectionString);
        SqlCommand cmd2=cn2.CreateCommand();
        cmd2.CommandText="
      
        SELECT * FROM dbo.ABCD
      
      ";
        cn2.
      
        Open
      
      ();
        cmd2.ExecuteReader();
        cn2.
      
        Close
      
      ();
        Response.
      
        Write
      
      ("
      
        連接關(guān)閉時(shí)間:
      
      "+
      
        DateTime
      
      .Now.ToLongTimeString()+"
      
        <br />
      
      ");

       

            SqlConnection cn3=new SqlConnection(ConnectionString);
        SqlCommand cmd3=cn3.CreateCommand();
        cmd3.CommandText="
      
        SELECT * FROM dbo.ABCD
      
      ";
        cn3.
      
        Open
      
      ();
        cmd3.ExecuteReader();
        cn3.
      
        Close
      
      ();
        Response.
      
        Write
      
      ("
      
        連接關(guān)閉時(shí)間:
      
      "+
      
        DateTime
      
      .Now.ToLongTimeString()+"
      
        <br />
      
      ");

        System.Threading.Thread.Sleep(1500);

        SqlConnection cn4=new SqlConnection(ConnectionString);
        SqlCommand cmd4=cn4.CreateCommand();
        cmd4.CommandText="
      
        SELECT * FROM dbo.ABCD
      
      ";
        cn4.
      
        Open
      
      ();
        cmd4.ExecuteReader();
        cn4.
      
        Close
      
      ();
        Response.
      
        Write
      
      ("
      
        連接關(guān)閉時(shí)間:
      
      "+
      
        DateTime
      
      .Now.ToLongTimeString()+"
      
        <br />
      
      ");
    

下面我們通過Profile截圖:

1

我們首先可以看到,每一次Close()方法都會(huì)觸發(fā)exec sp_reset_connection

此外,我們在中間等待的10秒還可以看到SP51是不斷的,剩下幾個(gè)連接全部用的是SPID51這個(gè)連接,雖然Ado.net Close了好幾次,但實(shí)際上物理連接是沒有中斷的。

因此可以看出,連接池大大的提升了效率。

Ado.net的連接池


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 偷偷操不一样的久久 | 中文字幕.com | 久久这里只有精品国产99 | 亚洲欧美日韩精品久久亚洲区 | 久久草视频在线 | 青青国产成人久久91网站站 | 国产系列 视频二区 | 亚洲免费一级片 | 久久香蕉国产线看观看精品蕉 | 牛牛影视成人午夜影视 | 波多结衣一区二区三区 | 国产波波社区精品视频 | 久久九九精品视频 | 色综合久久精品中文字幕 | 无遮挡无遮挡91桃色在线观看 | 九草视频在线 | 亚洲狠狠婷婷综合久久久久网站 | jizz中国jizz女人 | 日日操夜夜爱 | 色综久久天天综合绕视看 | 青青成人 | 久久99国产精品成人 | 国产高清日韩 | 四虎影院观看视频在线观看 | 欧美一级毛片生活片 | 狠狠色噜噜狠狠米奇777 | 9久9久女女热精品视频免费观看 | 欧美午夜在线视频 | 免费观看91视频 | 青青热在线观看视频精品 | 亚欧精品一区二区三区四区 | 综合黄色| 久久99精品久久久久久黑人 | 看全色黄大色大片免费久黄久 | 国产成人综合亚洲亚洲欧美 | 草操影院 | 成人人免费夜夜视频观看 | 亚洲欧美日韩国产一区图片 | 日韩国产欧美视频 | 久久精品免费大片国产大片 | 91热久久免费频精品动漫99 |