asp.net 數(shù)據(jù)庫連接池淺析
更新時(shí)間:2010年03月21日 23:36:45 作者:
asp.net是默認(rèn)支持連接池的,所以關(guān)于張方面的介紹和談?wù)摱急容^少,查了一下msdn,有一下知識(shí)
1,對(duì)于ASP.NET數(shù)據(jù)庫連接池可以使用一組名稱-值對(duì)以鏈接字符串的形式配置鏈接池。例如,可以配置池是否有效(默認(rèn)是有效的),池的最大、最小容量,用于打開鏈接的排隊(duì)請(qǐng)求被阻斷的時(shí)間。下面的示例字符串配置了池的最大和最小容量。
"Server=(local); Integrated Security=SSPI; Database=Northwind;
Max Pool Size=75; Min Pool Size=5"
ASP.NET數(shù)據(jù)庫連接池摘要
連接池允許應(yīng)用程序從連接池中獲得一個(gè)連接并使用這個(gè)連接,而不需要為每一個(gè)連接請(qǐng)求重新建立一個(gè)連接。一旦一個(gè)新的連接被創(chuàng)建并且放置在連接池中,應(yīng)用程序就可以重復(fù)使用這個(gè)連接而不必實(shí)施整個(gè)數(shù)據(jù)庫連接創(chuàng)建過程。
當(dāng)應(yīng)用程序請(qǐng)求一個(gè)連接時(shí),連接池為該應(yīng)用程序分配一個(gè)連接而不是重新建立一個(gè)連接;當(dāng)應(yīng)用程序使用完連接后,該連接被歸還給連接池而不是直接釋放。
2,
連接池減少新連接需要打開的次數(shù)。池進(jìn)程保持物理連接的所有權(quán)。通過為每個(gè)給定的連接配置保留一組活動(dòng)連接來管理連接。只要用戶在連接上調(diào)用 Open,池進(jìn)程就會(huì)檢查池中是否有可用的連接。如果某個(gè)池連接可用,會(huì)將該連接返回給調(diào)用者,而不是打開新連接。應(yīng)用程序在該連接上調(diào)用 Close 時(shí),池進(jìn)程會(huì)將連接返回到活動(dòng)連接池集中,而不是真正關(guān)閉連接。連接返回到池中之后,即可在下一個(gè) Open 調(diào)用中重復(fù)使用。
只有配置相同的連接可以建立池連接。ADO.NET 同時(shí)保留多個(gè)池,每個(gè)配置一個(gè)池。連接由連接字符串以及 Windows 標(biāo)識(shí)(在使用集成的安全性時(shí))分為多個(gè)池。
池連接可以大大提高應(yīng)用程序的性能和可縮放性。默認(rèn)情況下,ADO.NET 中啟用連接池。除非顯式禁用,否則,連接在應(yīng)用程序中打開和關(guān)閉時(shí),池進(jìn)程將對(duì)連接進(jìn)行優(yōu)化。還可以提供幾個(gè)連接字符串修飾符來控制連接池的行為
池的創(chuàng)建和分配
在初次打開連接時(shí),將根據(jù)完全匹配算法創(chuàng)建連接池,該算法將池與連接中的連接字符串關(guān)聯(lián)。每個(gè)連接池與不同的連接字符串關(guān)聯(lián)。打開新連接時(shí),如果連接字符串并非與現(xiàn)有池完全匹配,將創(chuàng)建一個(gè)新池。按進(jìn)程、按應(yīng)用程序域、按連接字符串以及(在使用集成的安全性時(shí))按 Windows 標(biāo)識(shí)來建立池連接。
在以下 C# 示例中創(chuàng)建了三個(gè)新的 SqlConnection 對(duì)象,但是管理時(shí)只需要兩個(gè)連接池。注意,根據(jù)為 Initial Catalog 分配的值,第一個(gè)和第二個(gè)連接字符串有所不同。
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.
}
如果 MinPoolSize 在連接字符串中未指定或指定為零,池中的連接將在一段時(shí)間不活動(dòng)后關(guān)閉。但是,如果指定的 MinPoolSize 大于零,在 AppDomain 被卸載并且進(jìn)程結(jié)束之前,連接池不會(huì)被破壞。非活動(dòng)或空池的維護(hù)只需要最少的系統(tǒng)開銷
添加連接
連接池是為每個(gè)唯一的連接字符串創(chuàng)建的。當(dāng)創(chuàng)建一個(gè)池后,將創(chuàng)建多個(gè)連接對(duì)象并將其添加到該池中,以滿足最小池大小的要求。連接根據(jù)需要添加到池中,但是不能超過指定的最大池大?。J(rèn)值為 100)。連接在關(guān)閉或斷開時(shí)釋放回池中。
在請(qǐng)求 SqlConnection 對(duì)象時(shí),如果存在可用的連接,將從池中獲取該對(duì)象。連接要可用,必須未使用,具有匹配的事務(wù)上下文或未與任何事務(wù)上下文關(guān)聯(lián),并且具有與服務(wù)器的有效鏈接。
連接池進(jìn)程通過在連接釋放回池中時(shí)重新分配連接,來滿足這些連接請(qǐng)求。如果已達(dá)到最大池大小且不存在可用的連接,則該請(qǐng)求將會(huì)排隊(duì)。然后,池進(jìn)程嘗試重新建立任何連接,直到到達(dá)超時(shí)時(shí)間(默認(rèn)值為 15 秒)。如果池進(jìn)程在連接超時(shí)之前無法滿足請(qǐng)求,將引發(fā)異常。
移除連接
連接池進(jìn)程定期掃描連接池,查找沒有通過 Close 或 Dispose 關(guān)閉的未用連接,并重新建立找到的連接。如果應(yīng)用程序沒有顯式關(guān)閉或斷開其連接,連接池進(jìn)程可能需要很長(zhǎng)時(shí)間才能重新建立連接,所以,最好確保在連接中顯式調(diào)用 Close 和 Dispose。
如果連接長(zhǎng)時(shí)間空閑,或池進(jìn)程檢測(cè)到與服務(wù)器的連接已斷開,連接池進(jìn)程會(huì)將該連接從池中移除。注意,只有在嘗試與服務(wù)器進(jìn)行通信之后才能檢測(cè)到斷開的連接。如果發(fā)現(xiàn)某連接不再連接到服務(wù)器,則會(huì)將其標(biāo)記為無效。無效連接只有在關(guān)閉或重新建立后,才會(huì)從連接池中移除。
如果存在與已消失的服務(wù)器的連接,那么即使連接池管理程序未檢測(cè)到已斷開的連接并將其標(biāo)記為無效,仍有可能將此連接從池中取出。這種情況是因?yàn)闄z查連接是否仍有效的系統(tǒng)開銷將造成與服務(wù)器的另一次往返,從而抵消了池進(jìn)程的優(yōu)勢(shì)。發(fā)生此情況時(shí),初次嘗試使用該連接將檢測(cè)連接是否曾斷開,并引發(fā)異常。
ASP.NET數(shù)據(jù)庫連接池優(yōu)點(diǎn)
使用連接池的最主要的優(yōu)點(diǎn)是性能。創(chuàng)建一個(gè)新的數(shù)據(jù)庫連接所耗費(fèi)的時(shí)間主要取決于網(wǎng)絡(luò)的速度以及應(yīng)用程序和數(shù)據(jù)庫服務(wù)器的(網(wǎng)絡(luò))距離,而且這個(gè)過程通常是一個(gè)很耗時(shí)的過程。而采用數(shù)據(jù)庫連接池后,數(shù)據(jù)庫連接請(qǐng)求可以直接通過連接池滿足而不需要為該請(qǐng)求重新連接、認(rèn)證到數(shù)據(jù)庫服務(wù)器,這樣就節(jié)省了時(shí)間。
ASP.NET數(shù)據(jù)庫連接池缺點(diǎn)
數(shù)據(jù)庫連接池中可能存在著多個(gè)沒有被使用的連接一直連接著數(shù)據(jù)庫(這意味著資源的浪費(fèi))。
技巧和提示
1.當(dāng)你需要數(shù)據(jù)庫連接時(shí)才去創(chuàng)建連接池,而不是提前建立。一旦你使用完連接立即關(guān)閉它,不要等到垃圾收集器來處理它。
2.在關(guān)閉數(shù)據(jù)庫連接前確保關(guān)閉了所有用戶定義的事務(wù)。
3.不要關(guān)閉數(shù)據(jù)庫中所有的連接,至少保證連接池中有一個(gè)連接可用。如果內(nèi)存和其他資源是你必須首先考慮的問題,可以關(guān)閉所有的連接,然后在下一個(gè)請(qǐng)求到來時(shí)創(chuàng)建連接池
"Server=(local); Integrated Security=SSPI; Database=Northwind;
Max Pool Size=75; Min Pool Size=5"
ASP.NET數(shù)據(jù)庫連接池摘要
連接池允許應(yīng)用程序從連接池中獲得一個(gè)連接并使用這個(gè)連接,而不需要為每一個(gè)連接請(qǐng)求重新建立一個(gè)連接。一旦一個(gè)新的連接被創(chuàng)建并且放置在連接池中,應(yīng)用程序就可以重復(fù)使用這個(gè)連接而不必實(shí)施整個(gè)數(shù)據(jù)庫連接創(chuàng)建過程。
當(dāng)應(yīng)用程序請(qǐng)求一個(gè)連接時(shí),連接池為該應(yīng)用程序分配一個(gè)連接而不是重新建立一個(gè)連接;當(dāng)應(yīng)用程序使用完連接后,該連接被歸還給連接池而不是直接釋放。
2,
連接池減少新連接需要打開的次數(shù)。池進(jìn)程保持物理連接的所有權(quán)。通過為每個(gè)給定的連接配置保留一組活動(dòng)連接來管理連接。只要用戶在連接上調(diào)用 Open,池進(jìn)程就會(huì)檢查池中是否有可用的連接。如果某個(gè)池連接可用,會(huì)將該連接返回給調(diào)用者,而不是打開新連接。應(yīng)用程序在該連接上調(diào)用 Close 時(shí),池進(jìn)程會(huì)將連接返回到活動(dòng)連接池集中,而不是真正關(guān)閉連接。連接返回到池中之后,即可在下一個(gè) Open 調(diào)用中重復(fù)使用。
只有配置相同的連接可以建立池連接。ADO.NET 同時(shí)保留多個(gè)池,每個(gè)配置一個(gè)池。連接由連接字符串以及 Windows 標(biāo)識(shí)(在使用集成的安全性時(shí))分為多個(gè)池。
池連接可以大大提高應(yīng)用程序的性能和可縮放性。默認(rèn)情況下,ADO.NET 中啟用連接池。除非顯式禁用,否則,連接在應(yīng)用程序中打開和關(guān)閉時(shí),池進(jìn)程將對(duì)連接進(jìn)行優(yōu)化。還可以提供幾個(gè)連接字符串修飾符來控制連接池的行為
池的創(chuàng)建和分配
在初次打開連接時(shí),將根據(jù)完全匹配算法創(chuàng)建連接池,該算法將池與連接中的連接字符串關(guān)聯(lián)。每個(gè)連接池與不同的連接字符串關(guān)聯(lián)。打開新連接時(shí),如果連接字符串并非與現(xiàn)有池完全匹配,將創(chuàng)建一個(gè)新池。按進(jìn)程、按應(yīng)用程序域、按連接字符串以及(在使用集成的安全性時(shí))按 Windows 標(biāo)識(shí)來建立池連接。
在以下 C# 示例中創(chuàng)建了三個(gè)新的 SqlConnection 對(duì)象,但是管理時(shí)只需要兩個(gè)連接池。注意,根據(jù)為 Initial Catalog 分配的值,第一個(gè)和第二個(gè)連接字符串有所不同。
復(fù)制代碼 代碼如下:
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.
}
如果 MinPoolSize 在連接字符串中未指定或指定為零,池中的連接將在一段時(shí)間不活動(dòng)后關(guān)閉。但是,如果指定的 MinPoolSize 大于零,在 AppDomain 被卸載并且進(jìn)程結(jié)束之前,連接池不會(huì)被破壞。非活動(dòng)或空池的維護(hù)只需要最少的系統(tǒng)開銷
添加連接
連接池是為每個(gè)唯一的連接字符串創(chuàng)建的。當(dāng)創(chuàng)建一個(gè)池后,將創(chuàng)建多個(gè)連接對(duì)象并將其添加到該池中,以滿足最小池大小的要求。連接根據(jù)需要添加到池中,但是不能超過指定的最大池大?。J(rèn)值為 100)。連接在關(guān)閉或斷開時(shí)釋放回池中。
在請(qǐng)求 SqlConnection 對(duì)象時(shí),如果存在可用的連接,將從池中獲取該對(duì)象。連接要可用,必須未使用,具有匹配的事務(wù)上下文或未與任何事務(wù)上下文關(guān)聯(lián),并且具有與服務(wù)器的有效鏈接。
連接池進(jìn)程通過在連接釋放回池中時(shí)重新分配連接,來滿足這些連接請(qǐng)求。如果已達(dá)到最大池大小且不存在可用的連接,則該請(qǐng)求將會(huì)排隊(duì)。然后,池進(jìn)程嘗試重新建立任何連接,直到到達(dá)超時(shí)時(shí)間(默認(rèn)值為 15 秒)。如果池進(jìn)程在連接超時(shí)之前無法滿足請(qǐng)求,將引發(fā)異常。
移除連接
連接池進(jìn)程定期掃描連接池,查找沒有通過 Close 或 Dispose 關(guān)閉的未用連接,并重新建立找到的連接。如果應(yīng)用程序沒有顯式關(guān)閉或斷開其連接,連接池進(jìn)程可能需要很長(zhǎng)時(shí)間才能重新建立連接,所以,最好確保在連接中顯式調(diào)用 Close 和 Dispose。
如果連接長(zhǎng)時(shí)間空閑,或池進(jìn)程檢測(cè)到與服務(wù)器的連接已斷開,連接池進(jìn)程會(huì)將該連接從池中移除。注意,只有在嘗試與服務(wù)器進(jìn)行通信之后才能檢測(cè)到斷開的連接。如果發(fā)現(xiàn)某連接不再連接到服務(wù)器,則會(huì)將其標(biāo)記為無效。無效連接只有在關(guān)閉或重新建立后,才會(huì)從連接池中移除。
如果存在與已消失的服務(wù)器的連接,那么即使連接池管理程序未檢測(cè)到已斷開的連接并將其標(biāo)記為無效,仍有可能將此連接從池中取出。這種情況是因?yàn)闄z查連接是否仍有效的系統(tǒng)開銷將造成與服務(wù)器的另一次往返,從而抵消了池進(jìn)程的優(yōu)勢(shì)。發(fā)生此情況時(shí),初次嘗試使用該連接將檢測(cè)連接是否曾斷開,并引發(fā)異常。
ASP.NET數(shù)據(jù)庫連接池優(yōu)點(diǎn)
使用連接池的最主要的優(yōu)點(diǎn)是性能。創(chuàng)建一個(gè)新的數(shù)據(jù)庫連接所耗費(fèi)的時(shí)間主要取決于網(wǎng)絡(luò)的速度以及應(yīng)用程序和數(shù)據(jù)庫服務(wù)器的(網(wǎng)絡(luò))距離,而且這個(gè)過程通常是一個(gè)很耗時(shí)的過程。而采用數(shù)據(jù)庫連接池后,數(shù)據(jù)庫連接請(qǐng)求可以直接通過連接池滿足而不需要為該請(qǐng)求重新連接、認(rèn)證到數(shù)據(jù)庫服務(wù)器,這樣就節(jié)省了時(shí)間。
ASP.NET數(shù)據(jù)庫連接池缺點(diǎn)
數(shù)據(jù)庫連接池中可能存在著多個(gè)沒有被使用的連接一直連接著數(shù)據(jù)庫(這意味著資源的浪費(fèi))。
技巧和提示
1.當(dāng)你需要數(shù)據(jù)庫連接時(shí)才去創(chuàng)建連接池,而不是提前建立。一旦你使用完連接立即關(guān)閉它,不要等到垃圾收集器來處理它。
2.在關(guān)閉數(shù)據(jù)庫連接前確保關(guān)閉了所有用戶定義的事務(wù)。
3.不要關(guān)閉數(shù)據(jù)庫中所有的連接,至少保證連接池中有一個(gè)連接可用。如果內(nèi)存和其他資源是你必須首先考慮的問題,可以關(guān)閉所有的連接,然后在下一個(gè)請(qǐng)求到來時(shí)創(chuàng)建連接池
您可能感興趣的文章:
- Java的MyBatis框架中對(duì)數(shù)據(jù)庫進(jìn)行動(dòng)態(tài)SQL查詢的教程
- java配置dbcp連接池(數(shù)據(jù)庫連接池)示例分享
- java配置數(shù)據(jù)庫連接池的方法步驟
- Tomcat 5.5 數(shù)據(jù)庫連接池配置
- .net數(shù)據(jù)庫連接池配置技巧(默認(rèn)值)
- eclipse3.2.2 + MyEclipse5.5 + Tomcat5.5.27 配置數(shù)據(jù)庫連接池
- Asp 操作Access數(shù)據(jù)庫時(shí)出現(xiàn)死鎖.ldb的解決方法
- Mybatis update數(shù)據(jù)庫死鎖之獲取數(shù)據(jù)庫連接池等待
相關(guān)文章
C# XML操作 代碼大全(讀XML,寫XML,更新,刪除節(jié)點(diǎn),與dataset結(jié)合等)
C#操作XML(讀XML,寫XML,更新,刪除節(jié)點(diǎn),與dataset結(jié)合等),以下就是操作XML的所有方法,相信可以滿足很大一部份的使用了。2009-06-06詳解如何在ASP.NET Core Web API中以三種方式返回?cái)?shù)據(jù)
這篇文章主要介紹了詳解如何在ASP.NET Core Web API中以三種方式返回?cái)?shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01一個(gè)比較通用的分頁控件,完整的設(shè)計(jì)時(shí)支持和比較流行的分頁模式(提供源碼下載)
本分頁控件還包含簡(jiǎn)單屬性,復(fù)雜屬性,自定義視圖狀態(tài),分頁事件,創(chuàng)建控件,render控件,Attribute,設(shè)計(jì)時(shí)支持等比較齊全的自定義控件的元素,是個(gè)不錯(cuò)學(xué)習(xí)自定義控件開發(fā)的例子2010-12-12asp.net實(shí)現(xiàn)在XmlTextWriter中寫入一個(gè)CDATA的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)在XmlTextWriter中寫入一個(gè)CDATA的方法,結(jié)合實(shí)例形式分析了XmlTextWriter寫入CDATA的步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-04-04使用grpcui測(cè)試ASP.NET core的gRPC服務(wù)
這篇文章介紹了使用grpcui測(cè)試ASP.NET core gRPC服務(wù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07asp.net 光棒效應(yīng)實(shí)現(xiàn)代碼
asp.net 光棒效應(yīng)(今天剛剛學(xué)到的)2009-12-12