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