如何理解ADO.Net Team工作使用說明
對于ADO.Net Team的推出。數(shù)據(jù)庫讀取技術(shù)也由原本的ADO進化為ADO.Net。技術(shù)人員和程序員大大的期盼,ADO.Net較ADO提供了更便捷的數(shù)據(jù)庫讀寫能力以及優(yōu)秀的性能。。。。
Connection Pool是ADO.Net一個用來提高性能的重要功能。但是對于Connection Pool的機制卻很少有文檔涉及,所以對于Connection Pool的排錯,一直都是一個很棘手的問題。對于OLEDB以及ODBC, 連接池是由Driver決定的。對于Oracle的數(shù)據(jù)庫,一般而言,8.0以上的版本都建議使用Oracle提供的ODP.Net。所以此文主要探討一下ADO.Net Team。
Connection Pool 是什么呢 ?
每當(dāng)程序需要讀寫數(shù)據(jù)庫的時候。Connection.Open()會使用ADO.Net Team,數(shù)據(jù)庫會為程序建立一個連接,并且保持打開狀態(tài),此后程序就可以使用T-SQL語句來查詢/更新數(shù)據(jù)庫。當(dāng)執(zhí)行到Connection.Close()后,數(shù)據(jù)庫就會關(guān)閉當(dāng)前的連接。很好,一切看上去都是如此有條不紊。
但是如果我的程序需要不定時的打開和關(guān)閉連接,(比如說 ASP.Net 或是 Web Service ),例如當(dāng)Http Request發(fā)送到服務(wù)器的時候、,我們需要打開Connection 然后使用Select* from Table 返回一個DataTable/DataSet給客戶端/瀏覽器,然后關(guān)閉當(dāng)前的Connection。那每次都Open/Close Connection 如此的頻繁操作對于整個系統(tǒng)無疑就成了一種浪費。ADO.Net Team就給出了一個比較好地解決方法。將先前的Connection保存起來,當(dāng)下一次需要打開連接的時候就將先前的Connection 交給下一個連接。這就是Connection Pool。#t#
Connection Pool 如何工作的?
首先當(dāng)一個程序執(zhí)行Connection.open()時候,ADO.Net Team就需要判斷,此連接是否支持Connection Pool (Pooling 默認(rèn)為True),如果指定為False, ADO.net就與數(shù)據(jù)庫之間創(chuàng)建一個連接(為了避免混淆,所有數(shù)據(jù)庫中的連接,都使用”連接”描述),然后返回給程序。如果指定為True,ADO.net就會根據(jù)ConnectString創(chuàng)建一個Connection Pool,然后向Connection Pool中填充Connection(所有.net程序中的連接,都使用”Connection”描述)。
填充多少個Connection由Min Pool Size (默認(rèn)為0)屬性來決定。例如如果指定為5,則ADO.net會一次與SQL數(shù)據(jù)庫之間打開5個連接,然后將4個Connection,保存在Connection Pool中,1個Connection返回給程序。
當(dāng)程序執(zhí)行到Connection.close() 的時候。如果Pooling 為True,ADO.Net Team就把當(dāng)前的Connection放到Connection Pool并且保持與數(shù)據(jù)庫之間的連接。同時還會判斷Connection Lifetime(默認(rèn)為0)屬性,0代表無限大,如果Connection存在的時間超過了Connection LifeTime,ADO.net就會關(guān)閉的Connection同時斷開與數(shù)據(jù)庫的連接,而不是重新保存到Connection Pool中。(這個設(shè)置主要用于群集的SQL 數(shù)據(jù)庫中,達(dá)到負(fù)載平衡的目的)。如果Pooling指定為False,則直接斷開與數(shù)據(jù)庫之間的連接。
然后當(dāng)下一次Connection.Open() 執(zhí)行的時候,ADO.Net Team就會判斷新的ConnectionString與之前保存在Connection Pool中的Connection的connectionString是否一致。(ADO.Net會將ConnectionString轉(zhuǎn)成二進制流,所以也就是說,新的ConnectionString與保存在Connection Pool中的Connection的ConnectionString必須完全一致。
即使多加了一個空格,或是修改了ADO.Net Team中某些屬性的次序都會讓ADO.Net認(rèn)為這是一個新的連接,而從新創(chuàng)建一個新的連接。所以如果您使用的UserID,Password的認(rèn)證方式,修改了Password也會導(dǎo)致一個Connection,如果使用的是SQL的集成認(rèn)證,就需要保存兩個連接使用的是同一個)。