.Net與Oracle的數(shù)據(jù)庫連接池(Connection Pool)
2024-07-10 13:03:31
供稿:網(wǎng)友
.net與oracle的數(shù)據(jù)庫連接池(connection pool)
概述:
數(shù)據(jù)庫連接池允許應(yīng)用程序重用已存在于池中的數(shù)據(jù)庫連接,以避免反復(fù)的建立新的數(shù)據(jù)庫連接。這種技術(shù)能有效提高應(yīng)用程序的伸縮性,因?yàn)橛邢薜臄?shù)據(jù)庫連接能夠給大量的客戶提供服務(wù)。這種技術(shù)同時也提高的系統(tǒng)性能,避免了大量建立新連接的開銷。
開發(fā)一個具有伸縮性的、高性能應(yīng)用程序應(yīng)該最大限度的減少建立連接所花費(fèi)的時間,保持?jǐn)?shù)據(jù)庫連接最大限度的有效,以存取數(shù)據(jù)。當(dāng)一個數(shù)據(jù)庫連接關(guān)閉時,它只是由連接池收回以待重用,并未真正釋放。但是,如果連接池被釋放,數(shù)據(jù)庫連接將會被釋放掉。
開發(fā)人員應(yīng)當(dāng)注意不要依賴?yán)厥諜C(jī)制去釋放數(shù)據(jù)庫連接,因?yàn)楫?dāng)參數(shù)超出作用域時,數(shù)據(jù)庫連接并沒有得必要的關(guān)閉,這種數(shù)據(jù)庫資源泄漏將導(dǎo)致建立新連接時拋出連接錯誤。
建立數(shù)據(jù)庫連接池
當(dāng)打開一個數(shù)據(jù)庫連接時,一個數(shù)據(jù)庫連接池也就創(chuàng)建了。數(shù)據(jù)庫連接池的創(chuàng)建與數(shù)據(jù)庫連接字符串精確的相關(guān)(包括空格、大小寫)。所有的連接池是根據(jù)連接字符串來區(qū)分的。在創(chuàng)建一個新的數(shù)據(jù)庫連接時,如果連接字符串不完全相同,將創(chuàng)建不同的連接池。
一旦數(shù)據(jù)庫連接池被創(chuàng)建,它將一直存在直到該進(jìn)程結(jié)束。維護(hù)一個非活動狀態(tài)的連接池幾乎不需要什么系統(tǒng)開銷。
連接池中的數(shù)據(jù)庫連接
連接池根據(jù)唯一的連接字符串被創(chuàng)建。在連接池被創(chuàng)建的同時,連接池將創(chuàng)建最小的數(shù)據(jù)庫連接,當(dāng)連接不夠用時,連接池將逐個添加數(shù)據(jù)庫連接直到達(dá)到最大連接數(shù),此后的連接請求將被加入請求隊列里。當(dāng)調(diào)用數(shù)據(jù)庫連接對象的close方法或dispose方法時,數(shù)據(jù)庫連接將被數(shù)據(jù)庫連接池回收。
當(dāng)數(shù)據(jù)庫連接使用完成后,要調(diào)用close方法或dispose方法將它返回連接池。沒有顯式釋放的數(shù)據(jù)庫連接可能會沒有返回連接池。
注意不要在類的finalize方法中調(diào)用任何管理類如connection,datareader等的finalize方法,必須將數(shù)據(jù)庫連接的釋放權(quán)交給連接池。
釋放數(shù)據(jù)庫連接
當(dāng)數(shù)據(jù)庫連接超時或服務(wù)已經(jīng)完成時,連接池將會將其資源釋放,這只能通過試圖與數(shù)據(jù)庫通訊來判斷。如果發(fā)現(xiàn)數(shù)據(jù)庫連接不可用,它將被標(biāo)記為不可用資源。數(shù)據(jù)庫連接池將定時掃描數(shù)據(jù)庫連接,釋放所有不可用資源。
如果發(fā)現(xiàn)現(xiàn)有的數(shù)據(jù)庫連接不可用,那么可能是該連接被數(shù)據(jù)庫連接池標(biāo)記為不可用資源了,這時將拋出一個異常。盡管如此,你還是必須釋放連接,將它返回連接池。
支持transaction
數(shù)據(jù)庫連接池內(nèi)的數(shù)據(jù)庫連接是按照transaction context劃分的,每當(dāng)連接池接到連接請求時,他將返回與請求者transaction context相匹配的數(shù)據(jù)庫連接。因此,每個連接池都由數(shù)個transaction context相關(guān)的數(shù)據(jù)庫連接和一個transaction context無關(guān)的數(shù)據(jù)庫連接組成。當(dāng)數(shù)據(jù)庫連接被返回連接池時,它將被放回對應(yīng)的transaction context組中。
用連接字符串關(guān)鍵字控制數(shù)據(jù)庫連接池
oracleconnection對象的屬性connectionstring有一些能支持連接池控制的key-value字符串。下表是這些key-value字符串的詳細(xì)說明。
名稱
默認(rèn)值
說明
connection lifetime
0
當(dāng)數(shù)據(jù)庫連接被返回到連接池中時,它的創(chuàng)建時間將與當(dāng)前時間比較,如果超過了connection lifetime規(guī)定的時間,它將被釋放掉。
為0時將被視為最大連接時間。
enlist
'true'
當(dāng)此值為true時,池中現(xiàn)存的所有數(shù)據(jù)庫連接將被加入到它的創(chuàng)建線程的transaction context中。如果不存在這個transaction context則無任何變化。
max pool size
100
連接池能建立的最大數(shù)據(jù)庫連接數(shù)。
min pool size
0
連接池要保持的最小數(shù)據(jù)庫連接數(shù)。
pooling
'true'
當(dāng)設(shè)為true時,數(shù)據(jù)庫連接將由相應(yīng)的連接池管理。