国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

ADO.NET中SQL Server數(shù)據(jù)庫連接池

開發(fā) 后端
連接到數(shù)據(jù)庫服務(wù)器通常由幾個需要很長時間的步驟組成。 必須建立物理通道(例如套接字或命名管道),必須與服務(wù)器進行初次握手,必須分析連接字符串信息,必須由服務(wù)器對連接進行身份驗證,必須運行檢查以便在當前事務(wù)中登記,等等。

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

連接池減少新連接需要打開的次數(shù)。 池進程保持物理連接的所有權(quán)。 通過為每個給定的連接配置保留一組活動連接來管理連接。 只要用戶在連接上調(diào)用 Open,池進程就會檢查池中是否有可用的連接。 如果某個池連接可用,會將該連接返回給調(diào)用者,而不是打開新連接。 應(yīng)用程序?qū)υ撨B接調(diào)用 Close 時,池進程會將連接返回到活動連接池集中,而不是真正關(guān)閉連接。 連接返回到池中之后,即可在下一個 Open 調(diào)用中重復使用。

只有配置相同的連接可以建立池連接。 ADO.NET 同時保留多個池,每個配置一個池。 連接由連接字符串以及 Windows 標識(在使用集成的安全性時)分為多個池。 還根據(jù)連接是否已在事務(wù)中登記來建立池連接。

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


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

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

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

   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 在連接字符串中未指定或指定為零,池中的連接將在一段時間不活動后關(guān)閉。 但是,如果指定的 MinPoolSize 大于零,在 AppDomain 被卸載并且進程結(jié)束之前,連接池不會被破壞。 非活動或空池的維護只需要最少的系統(tǒng)開銷。

注意:

當出現(xiàn)故障轉(zhuǎn)移等錯誤時,會自動清除池。

添加連接

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

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

連接池進程通過在連接釋放回池中時重新分配連接,來滿足這些連接請求。 如果已達到***池大小且不存在可用的連接,則該請求將會排隊。 然后,池進程嘗試重新建立任何連接,直到到達超時時間(默認值為 15 秒)。 如果池進程在連接超時之前無法滿足請求,將引發(fā)異常。

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

移除連接

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

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

清除池

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

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

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

Connection Lifetime

0

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

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

Connection Reset

'true'

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

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

Enlist

'true'

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

Load Balance Timeout

0

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

Max Pool Size

100

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

Min Pool Size

0

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

Pooling

'true'

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

從深藍居的博客上找到的描述:

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

既然是連接池的問題,那么我就針對該問題想到了2個解決辦法:

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

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

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

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

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

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

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

優(yōu)點

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

缺點

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

技巧和提示

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

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

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

連接池FAQ

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

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

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

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

3. 當連接池中的連接都已經(jīng)用完,而有新的連接請求到來時會發(fā)生什么?

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

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

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

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

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

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

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

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

***次運行:

***次運行

多次運行后:

多次運行后

測試按鈕的代碼如下:

   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中的五個主要對象
  3. 使用LINQ和ADO.NET創(chuàng)建Silverlight程序
  4. ADO.NET數(shù)據(jù)庫連接、操作SQL舉例
  5. ADO.NET中容易混淆的概念
責任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2011-05-20 13:11:22

ADO.NET

2009-11-12 08:59:18

ADO.NET數(shù)據(jù)庫連

2009-11-12 11:23:35

ADO.NET SQL

2009-11-03 16:51:04

ADO.NET連接池觀

2009-11-13 13:11:37

ADO.NET連接池

2009-12-23 09:01:15

ADO.NET連接池

2009-03-19 09:58:04

ADO.NET數(shù)據(jù)庫SQL操作

2009-11-12 09:25:21

ADO.NET連接池

2009-11-11 14:04:14

ADO.NET連接池

2009-12-23 14:53:28

ADO.NET連接池

2010-01-05 10:11:23

ADO.NET連接池

2009-11-03 15:58:22

2009-12-22 09:59:06

ADO.NET數(shù)據(jù)庫

2010-02-25 09:06:40

ADO.NET連接池

2009-12-30 16:22:58

ADO.NET連接池

2009-07-20 14:03:43

Ado.net連接池

2009-12-23 09:14:52

ADO.NET連接池

2009-12-22 13:34:48

ADO.Net Tea

2009-12-28 10:09:10

ADO.NET連接

2009-12-24 15:11:47

ADO.NET數(shù)據(jù)庫連
點贊
收藏

51CTO技術(shù)棧公眾號

老司机精品视频网站| 国产麻豆视频一区二区| 在线不卡国产精品| 国产一级在线| 国产精品区一区二区三区| 路边理发店露脸熟妇泻火| 性欧美videos另类喷潮| eeuss一区二区三区| 成人亚洲一区二区| 日本欧美国产在线| 亚洲最大在线| 97色在线观看| 欧美1区2区3区4区| 91精品成人久久| 亚洲日本一区二区三区在线| 欧美精品一二区| 91亚洲无吗| 欧美疯狂性受xxxxx另类| 香蕉久久久久久| 欧美精品在线观看| 成人午夜三级| 国产91色在线| 欧美黄色一级视频| 含羞草久久爱69一区| 日韩高清国产一区在线| 天天综合狠狠精品| 成人精品在线视频观看| 中文字幕av专区| 午夜av一区二区三区| 在线激情网站| 亚洲女人天堂成人av在线| 日韩黄色三级| 国产精品99久久久久久白浆小说| 亚洲一本二本| 欧美日韩亚洲在线| 激情综合色综合久久| 国产成人黄色片| 亚洲视频 欧洲视频| 国产精品久久久久一区二区国产| 538在线一区二区精品国产| 婷婷在线播放| 亚洲欧洲一区二区三区久久| 久久中文字幕一区二区| 欧美最顶级丰满的aⅴ艳星| 欧美电影免费播放| 精品在线视频一区二区| 欧美色18zzzzxxxxx| 9191国产精品| 伊人久久av导航| 99re在线精品| 国产女女做受ⅹxx高潮| 亚洲精品久久久蜜桃| 亚洲视频tv| 色系列之999| 日本一二区不卡| 亚洲高清在线播放| 国产精品乱人伦一区二区| 二区三区在线播放| 日韩三级成人av网| 一区二区日韩欧美| 99热这里只有精品免费| av在线不卡精品| 色噜噜狠狠色综合网图区| 精品国产一区二区三区噜噜噜| 蜜桃视频在线观看91| 91啪亚洲精品| 男人av在线| 日韩有码片在线观看| 99精品视频在线观看免费播放 | 亚乱亚乱亚洲乱妇| 久久精品国产v日韩v亚洲| 天天超碰亚洲| 成人免费视频91| 色噜噜偷拍精品综合在线| 深夜视频一区二区| 亚洲va国产va天堂va久久| 岛国精品在线播放| 黄视频在线播放| 欧美激情视频一区二区| 日韩国产精品久久久| 污视频网站在线看| 亚洲人成免费电影| 1000部精品久久久久久久久| 蜜臀av免费观看| 亚洲精品久久久久国产| 四季av一区二区三区免费观看| 亚洲第一页在线视频| 亚洲第一av色| 一区二区日韩| 日韩欧美一级在线| 欧美狂野另类xxxxoooo| 亚洲精品aaaaa| 91视频 -- 69xx| 精品嫩草影院久久| 天天射成人网| aaa一级毛片| 亚洲男同性视频| 久久视频精品| 国产黄人亚洲片| 在线影院福利| 久久久国产精品一区| 国产伦理一区| 男人在线视频资源| 中文精品99久久国产香蕉| 夜夜嗨av一区二区三区网站四季av| 天天干天天操天天做| 亚洲欧美中文日韩在线| 一本色道88久久加勒比精品| 色老板视频在线观看| 欧美xxxx18国产| 成人美女视频在线看| 韩国日本一区| 你懂的视频在线一区二区| 五月婷婷久久丁香| 群体交乱之放荡娇妻一区二区 | 五月天久久狠狠| 夜夜亚洲天天久久| 天堂久久av| 毛片在线播放视频| 亚洲欧美一区二区三区四区| 日韩和欧美的一区| 日本福利在线| 99久久99久久精品国产片| 一区二区三区在线视频观看58| 亚洲国产中文在线二区三区免| 久久成人免费观看| 在线播放日韩专区| 不卡av在线网| 精品网站999| 欧美激情一区二区三区在线视频 | 中文字幕亚洲综合久久筱田步美| 99这里有精品| 欧美zzoo| av在线亚洲男人的天堂| 欧美性xxxxhd| 欧美精品国产| www.成人.com| 国内精品视频免费| 欧美高清一级片在线| 男人天堂欧美日韩| 97人人爽人人澡人人精品| 国产91av视频在线观看| 亚洲人午夜色婷婷| av电影在线观看不卡| 少妇精品在线| 可播放的18gay1069| 国产精品激情av在线播放| 亚洲国产精品人人做人人爽| 久久中文视频| 欧美成人hd| 黄色一级视频播放| 美女撒尿一区二区三区| 国产精品麻豆视频| 欧美电影一区| 黄色在线免费看| 久久久久久久久久久久久国产| 久久精品国产欧美亚洲人人爽| 中文字幕欧美日韩一区| 欧美另类69xxxxx| 91涩漫在线观看| 宅男在线精品国产免费观看| 丝袜美腿精品国产二区| 日韩美女久久久| 红桃视频欧美| 欧美电影免费观看网站| 免费看污污网站| 亚洲精品欧美一区二区三区| 日韩欧美国产电影| 26uuu色噜噜精品一区二区| 欧美伦理影院| 国产蜜臀一区二区打屁股调教| 免费看一级大黄情大片| 国产精品久久久久久久av电影 | 日韩h在线观看| 国产欧美一区二区三区鸳鸯浴 | 黄色三级视频片| 国产欧美日韩综合精品| 欧美精选在线播放| heyzo一本久久综合| 成人羞羞网站入口免费| 欧美人与性动交α欧美精品图片| 欧美日韩不卡在线视频| 国产91在线播放| 日韩精品一区二区三区在线播放 | 超碰97在线免费| 明星裸体视频一区二区| 国产亚洲视频中文字幕视频| 亚洲婷婷在线视频| 老妇喷水一区二区三区| 3d动漫一区二区三区在线观看| eeuss一区| www.国产亚洲| 91嫩草在线视频| 这里只有精品在线播放| 黑人精品xxx一区一二区| 国产成人亚洲综合a∨婷婷| 欧美日一区二区| 香蕉成人av| 日本三级视频在线观看| 可以免费在线看黄的网站|