日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
ADO.NET中SQL Server數(shù)據(jù)庫(kù)連接池

實(shí)際上,大多數(shù)應(yīng)用程序僅使用一個(gè)或幾個(gè)不同的連接配置。 這意味著在執(zhí)行應(yīng)用程序期間,許多相同的連接將反復(fù)地打開(kāi)和關(guān)閉。 為了使打開(kāi)的連接成本***,ADO.NET 使用稱(chēng)為連接池的優(yōu)化方法。

創(chuàng)新互聯(lián)公司是一家專(zhuān)業(yè)提供武隆企業(yè)網(wǎng)站建設(shè),專(zhuān)注與做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為武隆眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)的建站公司優(yōu)惠進(jìn)行中。

連接池減少新連接需要打開(kāi)的次數(shù)。 池進(jìn)程保持物理連接的所有權(quán)。 通過(guò)為每個(gè)給定的連接配置保留一組活動(dòng)連接來(lái)管理連接。 只要用戶(hù)在連接上調(diào)用 Open,池進(jìn)程就會(huì)檢查池中是否有可用的連接。 如果某個(gè)池連接可用,會(huì)將該連接返回給調(diào)用者,而不是打開(kāi)新連接。 應(yīng)用程序?qū)υ撨B接調(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è)池。 還根據(jù)連接是否已在事務(wù)中登記來(lái)建立池連接。

池連接可以顯著提高應(yīng)用程序的性能和可縮放性。 默認(rèn)情況下,ADO.NET 中啟用連接池。除非顯式禁用,否則,連接在應(yīng)用程序中打開(kāi)和關(guān)閉時(shí),池進(jìn)程將對(duì)連接進(jìn)行優(yōu)化。 還可以提供幾個(gè)連接字符串修飾符來(lái)控制連接池的行為。


池的創(chuàng)建和分配

在初次打開(kāi)連接時(shí),將根據(jù)完全匹配算法創(chuàng)建連接池,該算法將池與連接中的連接字符串關(guān)聯(lián)。 每個(gè)連接池都與一個(gè)不同的連接字符串相關(guān)聯(lián)。 打開(kāi)新連接時(shí),如果連接字符串并非與現(xiàn)有池完全匹配,將創(chuàng)建一個(gè)新池。 按進(jìn)程、按應(yīng)用程序域、按連接字符串以及(在使用集成的安全性時(shí))按 Windows 標(biāo)識(shí)來(lái)建立池連接。 連接字符串還必須是完全匹配的;按不同順序?yàn)橥贿B接提供的關(guān)鍵字將分到單獨(dú)的池中。

在以下 C# 示例中創(chuàng)建了三個(gè)新的 SqlConnection 對(duì)象,但是管理時(shí)只需要兩個(gè)連接池。 注意,根據(jù)為 Initial Catalog 分配的值,***個(gè)和第二個(gè)連接字符串有所不同。

   1: using (SqlConnection connection = new SqlConnection(
    
      2: "Integrated Security=SSPI;Initial Catalog=Northwind"))
  
   3:     {
   4:         connection.Open();    
   5:         // Pool A is created.
   6:     }
   7: 
   8: using (SqlConnection connection = new SqlConnection(
   9:   "Integrated Security=SSPI;Initial Catalog=pubs"))
  10:     {
  11:         connection.Open();    
  12:         // Pool B is created because the connection strings differ.
  13:     }
  14: 
  15: using (SqlConnection connection = new SqlConnection(
  16:   "Integrated Security=SSPI;Initial Catalog=Northwind"))
  17:     {
  18:         connection.Open();    
  19:         // The connection string matches pool A.
  20:     }

如果 MinPoolSize 在連接字符串中未指定或指定為零,池中的連接將在一段時(shí)間不活動(dòng)后關(guān)閉。 但是,如果指定的 MinPoolSize 大于零,在 AppDomain 被卸載并且進(jìn)程結(jié)束之前,連接池不會(huì)被破壞。 非活動(dòng)或空池的維護(hù)只需要最少的系統(tǒng)開(kāi)銷(xiāo)。

注意:

當(dāng)出現(xiàn)故障轉(zhuǎn)移等錯(cuò)誤時(shí),會(huì)自動(dòng)清除池。

添加連接

連接池是為每個(gè)唯一的連接字符串創(chuàng)建的。 當(dāng)創(chuàng)建一個(gè)池后,將創(chuàng)建多個(gè)連接對(duì)象并將其添加到該池中,以滿足最小池大小的要求。 連接根據(jù)需要添加到池中,但是不能超過(guò)指定的***池大?。J(rèn)值為 100)。 連接在關(guān)閉或斷開(kāi)時(shí)釋放回池中。

在請(qǐng)求 SqlConnection 對(duì)象時(shí),如果存在可用的連接,將從池中獲取該對(duì)象。 連接要可用,必須未使用,具有匹配的事務(wù)上下文或未與任何事務(wù)上下文關(guān)聯(lián),并且具有與服務(wù)器的有效鏈接。

連接池進(jìn)程通過(guò)在連接釋放回池中時(shí)重新分配連接,來(lái)滿足這些連接請(qǐng)求。 如果已達(dá)到***池大小且不存在可用的連接,則該請(qǐng)求將會(huì)排隊(duì)。 然后,池進(jìn)程嘗試重新建立任何連接,直到到達(dá)超時(shí)時(shí)間(默認(rèn)值為 15 秒)。 如果池進(jìn)程在連接超時(shí)之前無(wú)法滿足請(qǐng)求,將引發(fā)異常。

警告:
我們強(qiáng)烈建議您在使用完連接后總是將其關(guān)閉,以使連接返回到池中。要關(guān)閉連接,可以使用 Connection 對(duì)象的 CloseDispose 方法,也可以通過(guò)在 C# 的 using 語(yǔ)句中或在 Visual Basic 的 Using 語(yǔ)句中打開(kāi)所有連接。 不是顯式關(guān)閉的連接可能不會(huì)添加或返回到池中。

移除連接

如果連接長(zhǎng)時(shí)間空閑,或池進(jìn)程檢測(cè)到與服務(wù)器的連接已斷開(kāi),連接池進(jìn)程會(huì)將該連接從池中移除。 注意,只有在嘗試與服務(wù)器進(jìn)行通信之后才能檢測(cè)到斷開(kāi)的連接。 如果發(fā)現(xiàn)某連接不再連接到服務(wù)器,則會(huì)將其標(biāo)記為無(wú)效。 無(wú)效連接只有在關(guān)閉或重新建立后,才會(huì)從連接池中移除。

如果存在與已消失的服務(wù)器的連接,那么即使連接池管理程序未檢測(cè)到已斷開(kāi)的連接并將其標(biāo)記為無(wú)效,仍有可能將此連接從池中取出。 這種情況是因?yàn)闄z查連接是否仍有效的系統(tǒng)開(kāi)銷(xiāo)將造成與服務(wù)器的另一次往返,從而抵消了池進(jìn)程的優(yōu)勢(shì)。 發(fā)生此情況時(shí),初次嘗試使用該連接將檢測(cè)連接是否曾斷開(kāi),并引發(fā)異常。

清除池

ADO.NET 2.0 引入了清除池的兩種新方法: ClearAllPools 和 ClearPool。 ClearAllPools 清除給定提供程序的連接池,ClearPool 清除與特定連接關(guān)聯(lián)的連接池。 如果在調(diào)用時(shí)連接正在使用,將進(jìn)行相應(yīng)的標(biāo)記。 連接關(guān)閉時(shí),將被丟棄,而不是返回池中。

使用連接字符串關(guān)鍵字控制連接池

下表列出了 ConnectionString 內(nèi)連接池值的有效名稱(chēng)。有關(guān)更多信息,請(qǐng)參見(jiàn) SQL Server 連接池 (ADO.NET)。

Connection Lifetime

0

當(dāng)連接被返回到池時(shí),將其創(chuàng)建時(shí)間與當(dāng)前時(shí)間作比較,如果時(shí)間長(zhǎng)度(以秒為單位)超出了由 Connection Lifetime 指定的值,該連接就會(huì)被銷(xiāo)毀。這在聚集配置中很有用(用于強(qiáng)制執(zhí)行運(yùn)行中的服務(wù)器和剛置于聯(lián)機(jī)狀態(tài)的服務(wù)器之間的負(fù)載平衡)。

零 (0) 值將使池連接具有***的連接超時(shí)。

Connection Reset

'true'

確定從池中提取數(shù)據(jù)庫(kù)連接時(shí)是否重置數(shù)據(jù)庫(kù)連接。對(duì)于 SQL Server 7.0 版,設(shè)置為 false 可避免獲取連接時(shí)再有一次額外的服務(wù)器往返行程,但須注意此時(shí)并未重置連接狀態(tài)(如數(shù)據(jù)庫(kù)上下文)。

只要不將 Connection Reset 設(shè)置為 false,連接池程序就不會(huì)受到 ChangeDatabase 方法的影響。連接在退出相應(yīng)的連接池以后將被重置,并且服務(wù)器將移回登錄時(shí)數(shù)據(jù)庫(kù)。不會(huì)創(chuàng)建新的連接,也不會(huì)重新進(jìn)行身份驗(yàn)證。如果將 Connection Reset 設(shè)置為 false,則池中可能會(huì)產(chǎn)生不同數(shù)據(jù)庫(kù)的連接。

Enlist

'true'

當(dāng)該值為 true 時(shí),池程序在創(chuàng)建線程的當(dāng)前事務(wù)上下文中自動(dòng)登記連接。可識(shí)別的值為 true、false、yes 和 no。

Load Balance Timeout

0

連接被銷(xiāo)毀前在連接池中生存的最短時(shí)間(以秒為單位)。

Max Pool Size

100

池中允許的***連接數(shù)。

Min Pool Size

0

池中允許的最小連接數(shù)。

Pooling

'true'

當(dāng)該值為 true 時(shí),系統(tǒng)將從適當(dāng)?shù)某刂刑崛?SQLConnection 對(duì)象,或在需要時(shí)創(chuàng)建該對(duì)象并將其添加到適當(dāng)?shù)某刂???勺R(shí)別的值為 true、false、yes 和 no。

從深藍(lán)居的博客上找到的描述:

前幾天同事問(wèn)我一個(gè)問(wèn)題,一種CS架構(gòu)的程序,直接把SQL Server作為服務(wù)端,每個(gè)客戶(hù)端直接連接數(shù)據(jù)庫(kù)操作(kay注:S2的cs項(xiàng)目就是這種架構(gòu)),如果客戶(hù)端打開(kāi)的數(shù)量過(guò)多時(shí)SQL Server的連接數(shù)將會(huì)特別高,數(shù)據(jù)庫(kù)端形成性能瓶頸,這種情況下怎么辦?想了想,造成這種情況的原因是ADO.NET的內(nèi)部機(jī)制造成的。ADO.NET中為了提高性能,所以使用了連接池,這樣每個(gè)請(qǐng)求就不必都創(chuàng)建一個(gè)連接,然后認(rèn)證,然后執(zhí)行SQL,而是從連接池中直接取出連接執(zhí)行SQL,執(zhí)行完成后也并不是真正關(guān)閉連接,而是將該連接重新放回連接池中。如果有100個(gè)客戶(hù)端,每個(gè)客戶(hù)端在使用一段時(shí)間后連接池中保存了10個(gè)連接,那么在這種情況下,即使不在客戶(hù)端做任何操作,SQL Server上都有1000個(gè)連接,這樣不出性能問(wèn)題才怪。

既然是連接池的問(wèn)題,那么我就針對(duì)該問(wèn)題想到了2個(gè)解決辦法:

1.關(guān)閉ADO.NET的連接池,每次執(zhí)行SQL時(shí)都是新建一個(gè)連接執(zhí)行,然后關(guān)閉。這樣做將使數(shù)據(jù)查詢(xún)有所減慢(每次都建立連接,每次都認(rèn)證,當(dāng)然會(huì)慢了),不過(guò)這個(gè)慢是毫秒級(jí)的,一般感覺(jué)不到的,但是如果一個(gè)操作就涉及到幾百個(gè)SQL語(yǔ)句的情況可能會(huì)明細(xì)感覺(jué)到減慢。修改方法特別簡(jiǎn)單,都不用修改代碼,在數(shù)據(jù)庫(kù)鏈接字符串中加入Pooling=False;即可。

2.修改架構(gòu),這種CS架構(gòu)除了性能問(wèn)題外還會(huì)出現(xiàn)其他的比如安全上的問(wèn)題??梢詫⒅苯舆B數(shù)據(jù)庫(kù)的方法改成連接服務(wù),這其中可以使用Remoting、Web服務(wù)等,當(dāng)然現(xiàn)在可以統(tǒng)一用WCF了。這樣做就只有服務(wù)程序去連接數(shù)據(jù)庫(kù),而客戶(hù)端只連接服務(wù)程序,這樣就不會(huì)出現(xiàn)連接池造成的瓶頸。不過(guò)這樣做代碼修改量很大,若真要改還是很痛苦的。

以下是網(wǎng)上找到的一篇介紹ADO.NET連接池的文章,感覺(jué)不錯(cuò)。

連接池允許應(yīng)用程序從連接池中獲得一個(gè)連接并使用這個(gè)連接,而不需要為每一個(gè)連接請(qǐng)求重新建立一個(gè)連接。一旦一個(gè)新的連接被創(chuàng)建并且放置在連接池中,應(yīng)用程序就可以重復(fù)使用這個(gè)連接而不必實(shí)施整個(gè)數(shù)據(jù)庫(kù)連接創(chuàng)建過(guò)程。

當(dāng)應(yīng)用程序請(qǐng)求一個(gè)連接時(shí),連接池為該應(yīng)用程序分配一個(gè)連接而不是重新建立一個(gè)連接;當(dāng)應(yīng)用程序使用完連接后,該連接被歸還給連接池而不是直接釋放。

如何實(shí)現(xiàn)連接池

確保你每一次的連接使用相同的連接字符串(和連接池相同);只有連接字符串相同時(shí)連接池才會(huì)工作。如果連接字符串不相同,應(yīng)用程序就不會(huì)使用連接池而是創(chuàng)建一個(gè)新的連接。

優(yōu)點(diǎn)

使用連接池的最主要的優(yōu)點(diǎn)是性能。創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接所耗費(fèi)的時(shí)間主要取決于網(wǎng)絡(luò)的速度以及應(yīng)用程序和數(shù)據(jù)庫(kù)服務(wù)器的(網(wǎng)絡(luò))距離,而且這個(gè)過(guò)程通常是一個(gè)很耗時(shí)的過(guò)程。而采用數(shù)據(jù)庫(kù)連接池后,數(shù)據(jù)庫(kù)連接請(qǐng)求可以直接通過(guò)連接池滿足而不需要為該請(qǐng)求重新連接、認(rèn)證到數(shù)據(jù)庫(kù)服務(wù)器,這樣就節(jié)省了時(shí)間。

缺點(diǎn)

數(shù)據(jù)庫(kù)連接池中可能存在著多個(gè)沒(méi)有被使用的連接一直連接著數(shù)據(jù)庫(kù)(這意味著資源的浪費(fèi))。

技巧和提示

1. 當(dāng)你需要數(shù)據(jù)庫(kù)連接時(shí)才去創(chuàng)建連接池,而不是提前建立。一旦你使用完連接立即關(guān)閉它,不要等到垃圾收集器來(lái)處理它。

2. 在關(guān)閉數(shù)據(jù)庫(kù)連接前確保關(guān)閉了所有用戶(hù)定義的事務(wù)。

3. 不要關(guān)閉數(shù)據(jù)庫(kù)中所有的連接,至少保證連接池中有一個(gè)連接可用。如果內(nèi)存和其他資源是你必須首先考慮的問(wèn)題,可以關(guān)閉所有的連接,然后在下一個(gè)請(qǐng)求到來(lái)時(shí)創(chuàng)建連接池。

連接池FAQ

1. 何時(shí)創(chuàng)建連接池?

當(dāng)***個(gè)連接請(qǐng)求到來(lái)時(shí)創(chuàng)建連接池;連接池的建立由數(shù)據(jù)庫(kù)連接的連接字符創(chuàng)來(lái)決定。每一個(gè)連接池都與一個(gè)不同的連接字符串相關(guān)。當(dāng)一個(gè)新的連接請(qǐng)求到來(lái)時(shí)如果連接字符串和連接池使用的字符串相同,就從連接池取出一個(gè)連接;如果不相同,就新建一個(gè)連接池。

2. 何時(shí)關(guān)閉連接池?

當(dāng)連接池中的所有連接都已經(jīng)關(guān)閉時(shí)關(guān)閉連接池。

3. 當(dāng)連接池中的連接都已經(jīng)用完,而有新的連接請(qǐng)求到來(lái)時(shí)會(huì)發(fā)生什么?

當(dāng)連接池已經(jīng)達(dá)到它的***連接數(shù)目時(shí),有新的連接請(qǐng)求到來(lái)時(shí),新的連接請(qǐng)求將放置到連接隊(duì)列中。當(dāng)有連接釋放給連接池時(shí),連接池將新釋放的連接分配給在隊(duì)列中排隊(duì)的連接請(qǐng)求。你可以調(diào)用close和dispose將連接歸還給連接池。

4. 我應(yīng)該如何允許連接池?

對(duì)于.NET應(yīng)用程序而言,默認(rèn)為允許連接池。(這意味著你可以不必為這件事情做任何的事情)當(dāng)然,如果你可以在SQLConnection對(duì)象的連接字符串中加進(jìn)Pooling=true;確保你的應(yīng)用程序允許連接池的使用。

5. 我應(yīng)該如何禁止連接池?

ADO.NET默認(rèn)為允許數(shù)據(jù)庫(kù)連接池,如果你希望禁止連接池,可以使用如下的方式:

1) 使用SQLConnection對(duì)象時(shí),往連接字符串加入如下內(nèi)容:Pooling=False;

2) 使用OLEDBConnection對(duì)象時(shí),往連接字符串加入如下內(nèi)容:OLE DB Services=-4;

通過(guò)上面的兩篇文章希望大家可以明白什么是數(shù)據(jù)庫(kù)連接池,什么時(shí)候適用,什么時(shí)候不適用。關(guān)于性能測(cè)試,我做了一個(gè)小例子,大家可以看看:

***次運(yùn)行:

多次運(yùn)行后:

測(cè)試按鈕的代碼如下:

   1: string connStringUsePool = "server=.;database=pubs;uid=sa;pwd=123456;pooling=true;connection lifetime=0;min pool size = 1;max pool size=50";
   2: string connStringUnUsePool = "server=.;database=pubs;uid=sa;pwd=123456;pooling=false";
   3: 
   4: private void button1_Click(object sender, EventArgs e)
   5: {
   6:   
   7: 
   8:     int count = 50;
   9: 
  10:     DateTime start = DateTime.Now;
  11:     for (int i = 0; i < count; i++)
  12:     {
  13:         using (SqlConnection conn = new SqlConnection(connStringUsePool))
  14:         {
  15:             conn.Open();
  16:             conn.Close();
  17:         }
  18:     }
  19:     DateTime end = DateTime.Now;
  20:     TimeSpan ts = end - start;
  21:     label1.Text = "使用連接池"+ts.Milliseconds.ToString();
  22: 
  23:     start = DateTime.Now;
  24:     for (int i = 0; i < count; i++)
  25:     {
  26:         using (SqlConnection conn = new SqlConnection(connStringUnUsePool))
  27:         {
  28:             conn.Open();
  29:             conn.Close();
  30:         }
  31:     }
  32:     end = DateTime.Now;
  33:     ts = end - start;
  34:     label2.Text = "不使用連接池" + ts.Milliseconds.ToString();
  35: }

【編輯推薦】

  1. ADO.NET中的多數(shù)據(jù)表操作讀取
  2. 淺談ADO.NET中的五個(gè)主要對(duì)象
  3. 使用LINQ和ADO.NET創(chuàng)建Silverlight程序
  4. ADO.NET數(shù)據(jù)庫(kù)連接、操作SQL舉例
  5. ADO.NET中容易混淆的概念

新聞名稱(chēng):ADO.NET中SQL Server數(shù)據(jù)庫(kù)連接池
URL分享:http://m.5511xx.com/article/ccoehdg.html