ADO.NET數據銜接池分析。本站提示廣大學習愛好者:(ADO.NET數據銜接池分析)文章只能為提供參考,不一定能成為您想要的結果。以下是ADO.NET數據銜接池分析正文
本篇文章來源於在GCR MVP Open Day的時刻和C# MVP張響評論辯論銜接池的概念而來的。是以零丁寫一篇文章分析一下銜接池。
為何須要銜接池
分析一個技巧第一個要問的是,這項技巧為何存在。
關於每個到SQL Server的銜接,都須要閱歷TCP/IP協定的三次握手,身份認證,在SQL Server裡樹立銜接,分派資本等。而當客戶端封閉銜接時,客戶端就會和SQL Server終止物理銜接。然則,我們做過數據庫開辟的人都曉得,每次操作完後封閉銜接是再正常不外的事了,一個運用法式即便在負載不年夜的情形下也須要一直的銜接SQL Server和封閉銜接,統一個運用法式同時也能夠存在多個銜接。
是以,假如赓續的如許樹立和封閉銜接,會長短常糟蹋資本的做法。是以Ado.net中存在銜接池這類機制。在對SQL Server來講的客戶真個運用法式過程中保護銜接池。同一治理Ado.net和SQL Server的銜接,既銜接池堅持和SQL Server的銜接,當Connection.Open()時,僅僅從銜接池平分配一個曾經和SQL Server樹立的銜接,當Connection.Close()時,也其實不是和SQL Server物理斷開銜接,僅僅是將銜接停止收受接管。
是以,銜接池老是能保護必定數目的和SQL Server的銜接,以便運用法式重復應用這些銜接以削減機能消耗。
重置銜接的sys.sp_reset_connection
銜接是有高低文的,好比說以後銜接有未提交的事務,存在可用的游標,存在對應的暫時表。是以為了便於銜接反復應用,使得下一個銜接不會收到上一個銜接的影響,SQL Server經由過程sys.sp_reset_connection來消除以後銜接的高低文,以便另外一個銜接持續應用。
當在Ado.net中挪用了Connection.Close()時,會觸發sys.sp_reset_connection。這個體系存儲進程年夜概會做以下工作:
封閉游標
消除暫時對象,好比暫時表
釋放鎖
重置Set選項
重置統計信息
回滾未提交的事務
切換到銜接的默許數據庫
重置Trace Flag
另外,依據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中挪用sys.sp_reset_connection,另外,這個辦法還會觸發Audit Login和Audit Logout事宜。
一個簡略的示例
上面我們經由過程一個簡略的示例來看銜接池的應用:
起首我分離應用四個銜接,個中第一個和第二個銜接之間有10秒的期待時光:
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("銜接封閉時光:"+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("銜接封閉時光:"+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("銜接封閉時光:"+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("銜接封閉時光:"+DateTime.Now.ToLongTimeString()+"<br />");
上面我們經由過程Profile截圖:
我們起首可以看到,每次Close()辦法都邑觸發exec sp_reset_connection
另外,我們在中央期待的10秒還可以看到SP51是赓續的,剩下幾個銜接全體用的是SPID51這個銜接,固然Ado.net Close了好幾回,但現實上物理銜接是沒有中止的。
是以可以看出,銜接池年夜年夜的晉升了效力。