日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ADO.NET中在C/S模式中使用的连接池

發(fā)布時間:2023/12/1 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ADO.NET中在C/S模式中使用的连接池 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前幾天同事問我一個問題,一種CS架構(gòu)的程序,直接把SQL Server作為服務(wù)端,每個客戶端直接連接數(shù)據(jù)庫操作,如果客戶端打開的數(shù)量過多時SQL Server的連接數(shù)將會特別高,數(shù)據(jù)庫端形成性能瓶頸,這種情況下怎么辦?想了想,造成這種情況的原因是ADO.NET的內(nèi)部機制造成的。ADO.NET中為了提高性能,所以使用了連接池,這樣每個請求就不必都創(chuàng)建一個連接,然后認證,然后執(zhí)行SQL,而是從連接池中直接取出連接執(zhí)行SQL,執(zhí)行完成后也并不是真正關(guān)閉連接,而是將該連接重新放回連接池中。如果有100個客戶端,每個客戶端在使用一段時間后連接池中保存了10個連接,那么在這種情況下,即使不在客戶端做任何操作,SQL Server上都有1000個連接,這樣不出性能問題才怪。

既然是連接池的問題,那么我就針對該問題想到了2個解決辦法:

1.關(guān)閉ADO.NET的連接池,每次執(zhí)行SQL時都是新建一個連接執(zhí)行,然后關(guān)閉。這樣做將使數(shù)據(jù)查詢有所減慢(每次都建立連接,每次都認證,當(dāng)然會慢了),不過這個慢是毫秒級的,一般感覺不到的,但是如果一個操作就涉及到幾百個SQL語句的情況可能會明細感覺到減慢。修改方法特別簡單,都不用修改代碼,在數(shù)據(jù)庫鏈接字符串中加入Pooling=False;即可。

2.修改架構(gòu),這種CS架構(gòu)除了性能問題外還會出現(xiàn)其他的比如安全上的問題??梢詫⒅苯舆B數(shù)據(jù)庫的方法改成連接服務(wù),這其中可以使用Remoting、Web服務(wù)等,當(dāng)然現(xiàn)在可以統(tǒng)一用WCF了。這樣做就只有服務(wù)程序去連接數(shù)據(jù)庫,而客戶端只連接服務(wù)程序,這樣就不會出現(xiàn)連接池造成的瓶頸。不過這樣做代碼修改量很大,若真要改還是很痛苦的。

以下是網(wǎng)上找到的一篇介紹ADO.NET連接池的文章,感覺不錯。

連接池允許應(yīng)用程序從連接池中獲得一個連接并使用這個連接,而不需要為每一個連接請求重新建立一個連接。一旦一個新的連接被創(chuàng)建并且放置在連接池中,應(yīng)用程序就可以重復(fù)使用這個連接而不必實施整個數(shù)據(jù)庫連接創(chuàng)建過程。

當(dāng)應(yīng)用程序請求一個連接時,連接池為該應(yīng)用程序分配一個連接而不是重新建立一個連接;當(dāng)應(yīng)用程序使用完連接后,該連接被歸還給連接池而不是直接釋放。

如何實現(xiàn)連接池

確保你每一次的連接使用相同的連接字符串(和連接池相同);只有連接字符串相同時連接池才會工作。如果連接字符串不相同,應(yīng)用程序就不會使用連接池而是創(chuàng)建一個新的連接。

優(yōu)點

使用連接池的最主要的優(yōu)點是性能。創(chuàng)建一個新的數(shù)據(jù)庫連接所耗費的時間主要取決于網(wǎng)絡(luò)的速度以及應(yīng)用程序和數(shù)據(jù)庫服務(wù)器的(網(wǎng)絡(luò))距離,而且這個過程通常是一個很耗時的過程。而采用數(shù)據(jù)庫連接池后,數(shù)據(jù)庫連接請求可以直接通過連接池滿足而不需要為該請求重新連接、認證到數(shù)據(jù)庫服務(wù)器,這樣就節(jié)省了時間。

缺點

數(shù)據(jù)庫連接池中可能存在著多個沒有被使用的連接一直連接著數(shù)據(jù)庫(這意味著資源的浪費)。

技巧和提示

1. 當(dāng)你需要數(shù)據(jù)庫連接時才去創(chuàng)建連接池,而不是提前建立。一旦你使用完連接立即關(guān)閉它,不要等到垃圾收集器來處理它。

2. 在關(guān)閉數(shù)據(jù)庫連接前確保關(guān)閉了所有用戶定義的事務(wù)。

3. 不要關(guān)閉數(shù)據(jù)庫中所有的連接,至少保證連接池中有一個連接可用。如果內(nèi)存和其他資源是你必須首先考慮的問題,可以關(guān)閉所有的連接,然后在下一個請求到來時創(chuàng)建連接池。

連接池FAQ

1. 何時創(chuàng)建連接池?

當(dāng)?shù)谝粋€連接請求到來時創(chuàng)建連接池;連接池的建立由數(shù)據(jù)庫連接的連接字符創(chuàng)來決定。每一個連接池都與一個不同的連接字符串相關(guān)。當(dāng)一個新的連接請求到來時如果連接字符串和連接池使用的字符串相同,就從連接池取出一個連接;如果不相同,就新建一個連接池。

2. 何時關(guān)閉連接池?

當(dāng)連接池中的所有連接都已經(jīng)關(guān)閉時關(guān)閉連接池。

3. 當(dāng)連接池中的連接都已經(jīng)用完,而有新的連接請求到來時會發(fā)生什么?

當(dāng)連接池已經(jīng)達到它的最大連接數(shù)目時,有新的連接請求到來時,新的連接請求將放置到連接隊列中。當(dāng)有連接釋放給連接池時,連接池將新釋放的連接分配給在隊列中排隊的連接請求。你可以調(diào)用close和dispose將連接歸還給連接池。

4. 我應(yīng)該如何允許連接池?

對于.NET應(yīng)用程序而言,默認為允許連接池。(這意味著你可以不必為這件事情做任何的事情)當(dāng)然,如果你可以在SQLConnection對象的連接字符串中加進Pooling=true;確保你的應(yīng)用程序允許連接池的使用。

5. 我應(yīng)該如何禁止連接池?

ADO.NET默認為允許數(shù)據(jù)庫連接池,如果你希望禁止連接池,可以使用如下的方式:

1) 使用SQLConnection對象時,往連接字符串加入如下內(nèi)容:Pooling=False;

2) 使用OLEDBConnection對象時,往連接字符串加入如下內(nèi)容:OLE DB Services=-4;

轉(zhuǎn)載于:https://www.cnblogs.com/itelite/archive/2009/03/15/1412157.html

總結(jié)

以上是生活随笔為你收集整理的ADO.NET中在C/S模式中使用的连接池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。