描述ADO.net屬性進(jìn)行仔細(xì)研究
進(jìn)行程序執(zhí)行的時(shí)候。如果是Pooling 為True,ADO.net屬性就把當(dāng)前地Connection放到Connection Pool并且維護(hù)與數(shù)據(jù)庫之間地連接。相應(yīng)情況下還會判斷Connection Lifetime(默認(rèn)為0)屬性,0代表無限大。
如果Connection存在地時(shí)間超過了Connection LifeTime,ADO.net屬性就會關(guān)閉地Connection相應(yīng)情況下斷開與數(shù)據(jù)庫地連接,而不是重新保存到Connection Pool中。(這個(gè)設(shè)置重點(diǎn)用于群集地SQL 數(shù)據(jù)庫中,達(dá)到負(fù)載平衡地目地)。如果Pooling指定為False,則直接斷開與數(shù)據(jù)庫之間地連接。
然后當(dāng)下一次Connection.Open() 執(zhí)行地時(shí)候,ADO.net屬性就會判斷新地ConnectionString與原先保存在Connection Pool中地Connection地connectionString是否一致。(ADO.net屬性會將ConnectionString轉(zhuǎn)成二進(jìn)制流,所以也就是說,新地ConnectionString與保存在Connection Pool中地Connection地ConnectionString必須完全一致,即使多加了一個(gè)空格,或是修改了Connection String中某些屬性地次序都會讓ADO.net屬性認(rèn)為這是一個(gè)新地連接,而從新創(chuàng)建一個(gè)新地連接。#t#
所以如果您運(yùn)用地UserID,Password地認(rèn)證方式,修改了Password也會導(dǎo)致一個(gè)Connection,如果運(yùn)用地是SQL地集成認(rèn)證,就需要保存兩個(gè)連接運(yùn)用地是同一個(gè))。然后ADO.net屬性需要判斷當(dāng)前地Connection Pool中是否有可以運(yùn)用地Connection(沒有被其他程序所占用),如果沒有地話,ADO.net屬性就需要判斷ConnectionString設(shè)置地Max Pool Size (默認(rèn)為100),如果Connection Pool中地所有Connection沒有達(dá)到Max Pool Size,ADO.net屬性則會再次連接數(shù)據(jù)庫,創(chuàng)建一個(gè)連接,然后將Connection返回給程序。
如果已經(jīng)達(dá)到了MaxPoolSize,ADO.net屬性就不會再次創(chuàng)建任何新地連接,而是等待Connection Pool中被其他程序所占用地Connection釋放,這個(gè)等待時(shí)間受SqlConnection.ConnectionTimeout(默認(rèn)是15秒)限制,也就是說如果時(shí)間超過了15秒,SqlConnection就會拋出超時(shí)錯誤(所以有時(shí)候如果SqlConnection.open()方法拋出超時(shí)錯誤,一個(gè)可能地原因就是沒有及時(shí)將原先地Connnection關(guān)閉,相應(yīng)情況下Connection Pool數(shù)量達(dá)到了MaxPoolSize。)#t#
如果有可用地Connection,從Connection Pool 取出地Connection也不是直接就返回給程序,ADO.net屬性還需要檢查ConnectionString地ConnectionReset屬性(默認(rèn)為True)是否需要對Connection 最一次reset。這是由于,原先從程序中返回地Connection可能已經(jīng)被修改過.
比如說運(yùn)用SqlConnection.ChangeDatabase method 修改當(dāng)前地連接,此時(shí)返回地Connection可能就已經(jīng)不是連接當(dāng)前地Connection String指定地Initial Catalog數(shù)據(jù)庫了。所以需要reset一次當(dāng)前地連接。當(dāng)然由于所有地額外檢查都會增大ADO.net屬性Connection Pool 對系統(tǒng)地開銷。