摘要:目前中國很多站點(diǎn)都采用了ASP.NET技術(shù)為用戶提供各類服務(wù)。提高Web的響應(yīng)速度、建立高性能的站點(diǎn),很大一部分取決于ASP.NET應(yīng)用程序的性能,因此對(duì)ASP.NET應(yīng)用程序的性能優(yōu)化至關(guān)重要。該文介紹了一些優(yōu)化ASP.NET數(shù)據(jù)層的方法。
關(guān)鍵詞:ASP.NET;數(shù)據(jù)層;Web應(yīng)用程序
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)14-3596-01
Methods of Optimizing Data Layer of ASP.NET
LI Qin, DOU Xiao-yu
(Shanxi Technical Collage of Finance and Economics, Xianyang 712000, China)
Abstract: Recently a lot of Websites use ASP.NET technology to provide consumers various services in China. To improve the Web response speed and build high performance Website, a large part of it depends on the performance of ASP.NET application, so it's vital to optimize it. This article presents some methods to optimize data layer of ASP.NET.
Key words: ASP.NET; data layer; Web application
1 引言
用ASP.NET編寫Web應(yīng)用程序其輕松程度令人難以置信。它是如此的容易,以至于許多開發(fā)人員不用花費(fèi)多少時(shí)間來構(gòu)筑其應(yīng)用便能獲得非常好的性能。
因?yàn)閿?shù)據(jù)庫通常都用專門的硬件,而且ASP.NET使用代碼和層之間的邊界分離,使用Web服務(wù)或遠(yuǎn)程調(diào)用將降低20%以上的性能。因此數(shù)據(jù)庫的處理成本仍然很高,因此最優(yōu)化代碼時(shí),數(shù)據(jù)層的性能應(yīng)該是首當(dāng)其充要關(guān)注的地方。
當(dāng)調(diào)整某個(gè)應(yīng)用程序的性能時(shí),你可以用它按先后次序:檢查代碼是否存取數(shù)據(jù)庫?如果是,多長時(shí)間存取一次?注意相同的測(cè)試也可以被應(yīng)用于使用Web服務(wù)或遠(yuǎn)程調(diào)用的代碼。
如果在特定的代碼流程中必須具有對(duì)數(shù)據(jù)庫的請(qǐng)求以及要考察其它方面,如:想對(duì)字符串處理進(jìn)行優(yōu)先優(yōu)化,那么暫且把它放一放,先按照上面定好的優(yōu)先次序來做。除非你有異乎尋常的性能問題,否則你的時(shí)間應(yīng)該用在嘗試最優(yōu)化與數(shù)據(jù)庫的連接所花的時(shí)間,返回的數(shù)據(jù)量以及多長時(shí)間往返一次和數(shù)據(jù)庫的通訊上。
有了這些概括信息,下面就看看能幫助改善ASP.NET應(yīng)用程序數(shù)據(jù)層性能的方法。下面將從能獲得最顯著效果的改變開始。
2 具體優(yōu)化方法
2.1 使用連接池
在實(shí)際應(yīng)用開發(fā)中,特別是在Web應(yīng)用系統(tǒng)中,直接訪問數(shù)據(jù)庫中的數(shù)據(jù),每一次數(shù)據(jù)訪問請(qǐng)求都必須經(jīng)歷建立數(shù)據(jù)庫連接、打開數(shù)據(jù)庫、存取數(shù)據(jù)和關(guān)閉數(shù)據(jù)庫連接等步驟,而連接并打開數(shù)據(jù)庫是一件既消耗資源又費(fèi)時(shí)的工作,如果頻繁發(fā)生這種數(shù)據(jù)庫操作,系統(tǒng)的性能必然會(huì)急劇下降,甚至?xí)?dǎo)致系統(tǒng)崩潰。數(shù)據(jù)庫連接池技術(shù)是解決這個(gè)問題最常用的方法,在許多應(yīng)用程序服務(wù)器中,基本都提供了這項(xiàng)技術(shù),無需自己編程,但是,深入了解這項(xiàng)技術(shù)是非常必要的。
建立Web應(yīng)用程序與SQL Server之間的TCP連接是一項(xiàng)開銷非常大的操作。微軟的開發(fā)人員利用連接池技術(shù)已經(jīng)有好長一段時(shí)間了,這個(gè)技術(shù)使他們能重用到數(shù)據(jù)庫的連接。而不是每次請(qǐng)求都建立新的TCP連接,新連接僅在連接池中得不到連接時(shí)才建立。當(dāng)連接被關(guān)閉時(shí),它被返回到連接池中,在那里它仍然保持與數(shù)據(jù)庫的連接,與完全斷開TCP連接相反。
為了充分用好連接池,有幾條規(guī)則必須了然于心。首先,打開連接,進(jìn)行處理,然后關(guān)閉連接。寧愿每個(gè)請(qǐng)求的連接打開和關(guān)閉多次,也不要保持連接打開狀態(tài)以及在不同的方法間將它傳來傳去。其次,使用相同的連接串(如果使用集成身份檢查,那么也要用相同的線程身份)。如果不用相同的連接串,例如,根據(jù)登錄用戶來定制連接串,你將無法得到連接池所提供的相同的最優(yōu)化值。當(dāng)模擬大用戶量情形時(shí),如果你使用集成身份檢查,那么你的連接池將效力大減。
不管什么時(shí)候,只要Web應(yīng)用程序連接到運(yùn)行在其它進(jìn)程中的資源,比如某個(gè)數(shù)據(jù)庫,你都應(yīng)該針對(duì)連接到資源所耗時(shí)間,發(fā)送和接收數(shù)據(jù)所耗時(shí)間以及往返次數(shù)進(jìn)行優(yōu)化。為了實(shí)現(xiàn)較好的性能,應(yīng)該首當(dāng)其充優(yōu)化應(yīng)用程序中任何種類的忙碌進(jìn)程。
2.2 使用ASP.NET Cache API
在編寫代碼之前要做的頭等大事之一是最大限度地構(gòu)建應(yīng)用層并發(fā)掘ASP.NET的Cache特性。
如果的組件在ASP.NET 應(yīng)用程序內(nèi)運(yùn)行,那么你只需要在應(yīng)用程序工程中引用 System.Web.dll即可。當(dāng)你需要訪問Cache時(shí),用HttpRuntime.Cache屬性(相同的對(duì)象也可以通過Page.Cache和HttpContext.Cache訪問)。
緩沖數(shù)據(jù)有幾個(gè)準(zhǔn)則。首先,如果數(shù)據(jù)能被使用多次,緩沖是個(gè)好的后選方案。其次,如果數(shù)據(jù)對(duì)給定請(qǐng)求或用戶是一般的數(shù)據(jù)而非專用數(shù)據(jù),那么最好是選擇緩沖。如果數(shù)據(jù)用戶或請(qǐng)求專用,如果需要保存期很長但可能不被經(jīng)常使用,那么仍然要用緩沖。第三,常常被忽略的一個(gè)準(zhǔn)則是有時(shí)緩沖太多的東西。一般來說,在x86機(jī)器上,為了降低內(nèi)存不足錯(cuò)誤的幾率,運(yùn)行某個(gè)進(jìn)程不要超過800MB私有字節(jié)。因此,緩沖應(yīng)該有個(gè)上限。
Cache有幾個(gè)重要特性是必須要了解的。第一個(gè)是Cache實(shí)現(xiàn)了最近最少使用(least-recently-used)算法,允許ASP.NET強(qiáng)制Cache清除操作,即如果可用內(nèi)存下降到低水平,則自動(dòng)從Cache中刪除不使用的項(xiàng)目。第二個(gè)是Cache支持依賴性和到期特性,它能強(qiáng)制包括時(shí)間,鍵值,文件失效。時(shí)間常常被使用,但ASP.NET 2.0引入了具有更強(qiáng)大的失效類型:數(shù)據(jù)庫緩沖失效。也就是當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)改變時(shí),緩沖中的條目會(huì)自動(dòng)刪除。
2.3 使用預(yù)請(qǐng)求緩沖
由于Cache API被設(shè)計(jì)用來緩沖長期數(shù)據(jù)或直到某個(gè)條件被滿足,預(yù)請(qǐng)求緩沖意旨用于請(qǐng)求期間的緩沖該數(shù)據(jù)。特定的代碼流程被每次請(qǐng)求頻繁訪問但是數(shù)據(jù)只需要被拾取、應(yīng)用、修改或更新一次,這樣說太理論化,還是看一個(gè)具體的例子吧。
在架設(shè)網(wǎng)站論壇應(yīng)用中,某個(gè)頁面上使用的每個(gè)服務(wù)器控件需要個(gè)性化數(shù)據(jù)以確定使用那個(gè)皮膚和式樣頁,以及其它的個(gè)性化數(shù)據(jù),其中有些數(shù)據(jù)可以被長時(shí)間緩沖,但有些數(shù)據(jù),比如用于控件的皮膚在單個(gè)請(qǐng)求中只被拾取一次并在該請(qǐng)求執(zhí)行期間被重用多次。
為了完成預(yù)請(qǐng)求緩沖,用ASP.NET HttpContext。HttpContext的實(shí)例是隨每個(gè)請(qǐng)求創(chuàng)建的,并可以通過HttpContext.Current屬性在那個(gè)請(qǐng)求執(zhí)行期間的任何地方存取它。HttpContext 類具有一個(gè)特別的Items集合屬性,被添加到該Items集合的對(duì)象和數(shù)據(jù)只是在該請(qǐng)求期間被緩存。就像可以使用Cache來保存頻繁使用的數(shù)據(jù)一樣,可以用HttpContext.Items來保存只在某個(gè)預(yù)請(qǐng)求中使用的數(shù)據(jù)。在此背景后的邏輯很簡單:當(dāng)數(shù)據(jù)不存在時(shí)被添加到 HttpContext.Items集合,以及在隨后的并發(fā)查找中簡單地返回HttpContext.Items中發(fā)現(xiàn)的數(shù)據(jù)。
3 結(jié)論
該文所描述的性能改進(jìn)有兩種類型:大型優(yōu)化,如使用連接池和ASP.NET Cache API,以及進(jìn)行微型優(yōu)化,如使用預(yù)請(qǐng)求緩沖。這些微型優(yōu)化有時(shí)很有意義,它對(duì)代碼的小小改動(dòng)便會(huì)引起很大的動(dòng)靜,產(chǎn)生成千次的調(diào)用。對(duì)于大型優(yōu)化,可能會(huì)看到整體性能的大跳躍。而對(duì)微型優(yōu)化,給定請(qǐng)求可能只是毫秒級(jí)的調(diào)整,但按每天的請(qǐng)求總數(shù)計(jì)算,其結(jié)果的改進(jìn)可能是巨大的。
參考文獻(xiàn):
[1] 鄧文淵,陳惠貞,陳俊榮.ASP與網(wǎng)頁數(shù)據(jù)庫設(shè)計(jì)[M].北京:中國鐵道出版社,2004.
[2] 劉宏峰,陳江波.ASP網(wǎng)絡(luò)開發(fā)技術(shù)大全[M].北京:人民郵電出版社,2001.
[3] Hasan, Jeffrey Tu, Kenneth.Performance Tuning and Optimization for Asp.Net Applications.[M].Addison Wesley Longman 2002.
[4] 宣小平,但正剛,張文毅.ASP數(shù)據(jù)庫系統(tǒng)開發(fā)實(shí)例導(dǎo)航[M].北京:人民郵電出版社,2003.