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