人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

ADO.NET數(shù)據(jù)連接池剖析

發(fā)布日期:2022-01-10 11:04 | 文章來源:源碼之家
為什么需要連接池
剖析一個技術(shù)第一個要問的是,這項技術(shù)為什么存在。
對于每一個到SQL Server的連接,都需要經(jīng)歷TCP/IP協(xié)議的三次握手,身份認證,在SQL Server里建立連接,分配資源等。而當客戶端關(guān)閉連接時,客戶端就會和SQL Server終止物理連接。但是,我們做過數(shù)據(jù)庫開發(fā)的人都知道,每次操作完后關(guān)閉連接是再正常不過的事了,一個應(yīng)用程序即使在負載不大的情況下也需要不停的連接SQL Server和關(guān)閉連接,同一個應(yīng)用程序同時也可能存在多個連接。 因此,如果不斷的這樣建立和關(guān)閉連接,會是非常浪費資源的做法。因此Ado.net中存在連接池這種機制。在對SQL Server來說的客戶端的應(yīng)用程序進程中維護連接池。統(tǒng)一管理Ado.net和SQL Server的連接,既連接池保持和SQL Server的連接,當Connection.Open()時,僅僅從連接池中分配一個已經(jīng)和SQL Server建立的連接,當Connection.Close()時,也并不是和SQL Server物理斷開連接,僅僅是將連接進行回收。 因此,連接池總是能維護一定數(shù)量的和SQL Server的連接,以便應(yīng)用程序反復(fù)使用這些連接以減少性能損耗。 重置連接的sys.sp_reset_connection
連接是有上下文的,比如說當前連接有未提交的事務(wù),存在可用的游標,存在對應(yīng)的臨時表。因此為了便于連接重復(fù)使用,使得下一個連接不會收到上一個連接的影響,SQL Server通過sys.sp_reset_connection來清除當前連接的上下文,以便另一個連接繼續(xù)使用。 當在Ado.net中調(diào)用了Connection.Close()時,會觸發(fā)sys.sp_reset_connection。這個系統(tǒng)存儲過程大概會做如下事情:
關(guān)閉游標
清除臨時對象,比如臨時表
釋放鎖
重置Set選項
重置統(tǒng)計信息
回滾未提交的事務(wù)
切換到連接的默認數(shù)據(jù)庫
重置Trace Flag
此外,根據(jù)BOL上的信息:
復(fù)制代碼 代碼如下:

"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,此外,這個方法還會觸發(fā)Audit Login和Audit Logout事件。 一個簡單的示例
下面我們通過一個簡單的示例來看連接池的使用:
首先我分別使用四個連接,其中第一個和第二個連接之間有10秒的等待時間:
復(fù)制代碼 代碼如下:

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)閉時間:"+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)閉時間:"+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)閉時間:"+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)閉時間:"+DateTime.Now.ToLongTimeString()+"<br />");

下面我們通過Profile截圖:
1
我們首先可以看到,每一次Close()方法都會觸發(fā)exec sp_reset_connection
此外,我們在中間等待的10秒還可以看到SP51是不斷的,剩下幾個連接全部用的是SPID51這個連接,雖然Ado.net Close了好幾次,但實際上物理連接是沒有中斷的。
因此可以看出,連接池大大的提升了效率。

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部