日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

ado.net mysql 连接池_ADO.NET数据连接池

發(fā)布時(shí)間:2025/3/15 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ado.net mysql 连接池_ADO.NET数据连接池 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【IT168 技術(shù)文檔】21世紀(jì)什么最貴?數(shù)據(jù)庫(kù)連接。對(duì)于以數(shù)據(jù)庫(kù)做數(shù)據(jù)存儲(chǔ)基石的應(yīng)用系統(tǒng)來(lái)說(shuō),數(shù)據(jù)庫(kù)連接是整個(gè)系統(tǒng)中最珍貴的資源之一。數(shù)據(jù)庫(kù)連接池是為了更有效地利用數(shù)據(jù)庫(kù)連接的最重要措施。它對(duì)于一個(gè)大型的應(yīng)用系統(tǒng)的性能至關(guān)重要,特別是Web應(yīng)用。ADO.NET Data Provider(以下簡(jiǎn)稱Data Provider)會(huì)幫我們管理連接池,所以有人說(shuō)使用連接池就像游兒童池一樣輕松。但并不是說(shuō)有了Data Provider程序員就萬(wàn)事無(wú)憂的,不正確地使用連接池可能導(dǎo)致你的應(yīng)用在池里淹死。筆者希望通過本文能讓讀者徹底明白連接池的重要性以及能根據(jù)實(shí)際情況正確配置連接池的參數(shù),明白實(shí)際應(yīng)用中出現(xiàn)的連接泄漏、“死連接”等異常情況和應(yīng)對(duì)方法,讓應(yīng)用輕松暢游連接池。本文主要介紹ADO.NET 1.1的連接池。

1、什么是連接池

連接池是Data Provider提供的一個(gè)機(jī)制,使得應(yīng)用程序使用的連接保存在連接池里而避免每次都要完成建立/關(guān)閉連接的完整過程。要理解連接池,先要理解程序里SqlConnection.Open()、SqlConnection.Close()和打開/關(guān)閉一個(gè)“物理連接”的關(guān)系。

Data Provider在收到連接請(qǐng)求時(shí)建立連接的完整過程是:先連接池里建立新的連接(即“邏輯連接”),然后建立該“邏輯連接”對(duì)應(yīng)的“物理連接”。建立“邏輯連接”一定伴隨著建立“物理連接”。Data Provider關(guān)閉一個(gè)連接的完整過程是先關(guān)閉“邏輯連接”對(duì)應(yīng)的“物理連接”然后銷毀“邏輯連接”。銷毀“邏輯連接”一定伴隨著關(guān)閉“物理連接”。SqlConnection.Open()是向Data Provider請(qǐng)求一個(gè)連接,Data Provider不一定需要完成建立連接的完整過程,可能只需要從連接池里取出一個(gè)可用的連接就可以;SqlConnection.Close()是請(qǐng)求關(guān)閉一個(gè)連接,Data Provider不一定需要完成關(guān)閉連接的完整過程,可能只需要把連接釋放回連接池就可以。

下面以一個(gè)例子來(lái)說(shuō)明。本文例子都使用Console Application。我們使用操作系統(tǒng)的性能監(jiān)視器來(lái)比較使用連接池與否,數(shù)據(jù)庫(kù)的“物理連接”數(shù)量的不同。因?yàn)樾阅鼙O(jiān)視器至少每一秒采集一次數(shù)據(jù),為方便觀察效果,代碼中Open和Close連接后都Sleep一秒。

SqlConnection con=new SqlConnection("server=.;

database=northwind;pooling=false;trusted_connection=true");

for(inti=0;i<10;i++)

{

try

{

con.Open();

System.Threading.Thread.Sleep(1000);

}

catch(Exception e){Console.WriteLine(e.Message);}

finally

{

con.Close();

System.Threading.Thread.Sleep(1000);

}

}

首先,不使用連接池做測(cè)試。以上程序中pooing = false表示不使用連接池,程序使用同一個(gè)連接串Open & Close了10次連接,使用性能計(jì)數(shù)器觀察SQL Server的“物理連接”數(shù)量。從下面的鋸齒圖可以看出每執(zhí)行一次con.Open(),SQLServer的“物理連接”數(shù)量都增加一,而每執(zhí)行一次con.Close(),SQLServer的“物理連接”數(shù)量都減少一。由于不使用連接池,每次Close連接的時(shí)候Data Provider需要把“邏輯連接”和“物理連接”都銷毀了,每次Open連接的時(shí)候Data Provider需要 建立“邏輯連接”和“物理連接”,鋸齒圖因此而成。

圖1

下面啟用連接池再測(cè)試一次。把連接串的pooling參數(shù)改為true,另外在for循環(huán)后加上Console.Read()。

從下圖可以看出,從第一次Open到第執(zhí)行完Console.Read()這段時(shí)間內(nèi),SQL Server的“物理連接”數(shù)量一直保持為1,直到關(guān)閉console應(yīng)用程序的進(jìn)程后SQL Server的“物理連接”數(shù)量才變?yōu)?。由于使用了連接池,每次Close連接的時(shí)候Data Provider只需把“邏輯連接”釋放回連接池,對(duì)應(yīng)的“物理連接”則保持打開的狀態(tài)。每次Open連接的時(shí)候,Data Provider只需從連接池取出一個(gè)“邏輯連接”,這樣就可以使用其對(duì)應(yīng)“物理連接”而不需建立新的“物理連接”,直線圖因此而成。

圖2

在ADO.NET 1.1下使用性能計(jì)數(shù)器觀察連接池有關(guān)計(jì)數(shù)器需要注意兩個(gè)bug。

(1)當(dāng)應(yīng)用程序進(jìn)程關(guān)閉后,計(jì)數(shù)器“SqlClient: Current # pooled connections”和“SqlClient: Current # connection pools”不會(huì)減為0,所以每重新運(yùn)行一次應(yīng)用程序性能計(jì)數(shù)器的值在上次的值的基礎(chǔ)上一直累加。這是計(jì)數(shù)器的錯(cuò)誤顯示,實(shí)際上當(dāng)應(yīng)用程序關(guān)閉后connection pool和pooled connection就減為0。因?yàn)殛P(guān)閉應(yīng)用程序后把性能監(jiān)視器也關(guān)閉,重啟應(yīng)用程序后再重新打開性能監(jiān)視器就可以看出“SqlClient: Current # pooled connections”和“SqlClient: Current # connection pools”是重新從0開始上升的。

(2)用斷點(diǎn)調(diào)試的情況下,連接串為"server = .;database = northwind;pooling = true;trusted_connection = true" 的connnection第一次Open的時(shí)候“SqlClient: Current # pooled connections”就從0變?yōu)?。但根據(jù)連接串參數(shù)的意義,只Open了一個(gè)connection,“SqlClient: Current # pooled connections”應(yīng)該從0變?yōu)?(圖2是在沒有斷點(diǎn)調(diào)試的情況下得出的曲線)。這不是計(jì)數(shù)器顯示錯(cuò)誤,而是ADO.ENT 1.1本身的bug,因?yàn)椤癠ser Connections”也隨著“SqlClient: Current # pooled connections”從0變?yōu)?。

為什么需要連接池?

完成建立/關(guān)閉一個(gè)連接的完整過程是一個(gè)消耗大量資源和時(shí)間的一個(gè)過程。想象一下一個(gè)ASP.NET的系統(tǒng),里面包含大量訪問數(shù)據(jù)庫(kù)的代碼片,系統(tǒng)有大量的用戶同時(shí)在使用系統(tǒng),如果程序每次Open/Close一個(gè)連接Data Provider都完成建立/關(guān)閉一個(gè)連接的完整過程,這樣的系統(tǒng)性能肯定讓人無(wú)法接受。

Data Provider提供連接池并通過連接池實(shí)現(xiàn)“物理連接”重復(fù)使用而避免頻繁地建立和關(guān)閉“物理連接”,從而大大提高應(yīng)用系統(tǒng)的性能。圖1描述一個(gè)應(yīng)用的不同Client App使用連接池訪問數(shù)據(jù)庫(kù),Data Provider負(fù)責(zé)建立和管理一個(gè)或者多個(gè)的連接池,每一個(gè)連接池里有一個(gè)或者多個(gè)連接,池里的連接就是“邏輯連接”。連接池里有N個(gè)連接表示該連接池與數(shù)據(jù)庫(kù)之間有N個(gè)“物理連接”。增加一個(gè)連接,連接池與數(shù)據(jù)庫(kù)的“物理連接”就增加一個(gè),減少一個(gè)連接,連接池與數(shù)據(jù)庫(kù)的“物理連接”就減少一個(gè)。

圖3

總結(jié)

以上是生活随笔為你收集整理的ado.net mysql 连接池_ADO.NET数据连接池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。