如何更好的進(jìn)行ADO.NET連接池連接
ADO.NET連接池是通過(guò)內(nèi)部機(jī)制組成的。為了提高它的性能,于是就用了ADO.NET連接池,這樣每個(gè)請(qǐng)求就不必都創(chuàng)建一個(gè)連接,接下來(lái)認(rèn)證,然后執(zhí)行SQL,在通過(guò)連接字符串創(chuàng)建SqlConnection對(duì)象時(shí),創(chuàng)建了連接池。其連接字符串的格式如下:
- Data Source=127.0.0.1;Initial Catalog=pub;
- Persist Security Info=True;User ID=sa;password=sa;
- Pooling=True;Min Pool Size=10;Max Pool Size=200;timeout=60
(1)默認(rèn)情況下,連接字符串中Pooling屬性為True。如果使用連接池,在創(chuàng)建連接對(duì)象時(shí),應(yīng)該使用同一個(gè)連接字符串。ADO.net允許創(chuàng)建多個(gè)連接池,并且每個(gè)池都與不同的連接字符串關(guān)聯(lián),打開(kāi)新連接時(shí),如果連接字符串并非與現(xiàn)有池完全匹配,將創(chuàng)建一個(gè)新池。如果 MinPoolSize 在連接字符串中未指定或指定為零,池中的連接將在一段時(shí)間不活動(dòng)后關(guān)閉。但是,如果指定的 MinPoolSize 大于零,在 AppDomain 被卸載并且進(jìn)程結(jié)束之前,連接池不會(huì)被破壞。非活動(dòng)或空池的維護(hù)只需要最少的系統(tǒng)開(kāi)銷。
(2)添加連接
連接池是為每個(gè)唯一的連接字符串創(chuàng)建的。當(dāng)創(chuàng)建一個(gè)池后,將創(chuàng)建多個(gè)連接對(duì)象并將其添加到該池中,以滿足最小池大小的要求。連接根據(jù)需要添加到池中,但是不能超過(guò)指定的***池大?。J(rèn)值為 100)。連接在關(guān)閉或斷開(kāi)時(shí)釋放回池中。連接池進(jìn)程通過(guò)在連接釋放回池中時(shí)重新分配連接,來(lái)滿足這些連接請(qǐng)求。如果已達(dá)到***池大小且不存在可用的連接,則該請(qǐng)求將會(huì)排隊(duì)。然后,池進(jìn)程嘗試重新建立任何連接,直到到達(dá)超時(shí)時(shí)間(默認(rèn)值為 15 秒)。如果池進(jìn)程在連接超時(shí)之前無(wú)法滿足請(qǐng)求,將引發(fā)異常。#t#
(3)移除連接
如果連接長(zhǎng)時(shí)間空閑,或池進(jìn)程檢測(cè)到與服務(wù)器的連接已斷開(kāi),連接池進(jìn)程會(huì)將該連接從池中移除。在使用完連接時(shí)一定要關(guān)閉連接,以便連接可以返回池。要關(guān)閉連接,可以使用 Connection 對(duì)象的 Close 或 Dispose 方法,也可以通過(guò)在 C# 的 using 語(yǔ)句中。
(4)清除池
ADO.NET 2.0 引入了兩種新的方法來(lái)清除池:ClearAllPools 和 ClearPool。ClearAllPools 清除指定提供程序的連接池,ClearPool 清除與特定連接關(guān)聯(lián)的ADO.NET連接池。
(5)事務(wù)支持
連接是根據(jù)事務(wù)上下文來(lái)從池中取出并進(jìn)行分配的。除非在連接字符串中指定了 Enlist=false,否則ADO.NET連接池將確保連接在 Current 上下文中登記。如果連接使用登記的 System.Transactions 事務(wù)關(guān)閉并返回到池中,連接將保留在池中,以便使用相同 System.Transactions 事務(wù)對(duì)該連接池的下一次請(qǐng)求將返回相同的連接(如果可用)。如果發(fā)出這樣的請(qǐng)求,而沒(méi)有可用的池連接,則會(huì)從池的非事務(wù)性部分取出一個(gè)連接并登記。如果在池的每個(gè)區(qū)域都沒(méi)有可用的連接,則會(huì)創(chuàng)建一個(gè)新的連接并登記。