亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        從五個(gè)方面提高ASP.NET應(yīng)用程序的性能

        2008-12-31 00:00:00劉翠煥李素朵司海峰
        電腦知識與技術(shù) 2008年14期

        摘要:在利用ASP.NET編程時(shí),會遇到應(yīng)用程序性能不高的問題,在此對如何有效的提高應(yīng)用程序性能方面進(jìn)行了研究,提出了在數(shù)據(jù)庫操作中從數(shù)據(jù)查詢、數(shù)據(jù)輸出、數(shù)據(jù)庫連接等幾個(gè)方面提高應(yīng)用程序性能的五種方法,在實(shí)際工作中進(jìn)行了驗(yàn)證,收到了預(yù)期的效果。

        關(guān)鍵詞:數(shù)據(jù)庫;連接池;緩存;視圖

        中文圖分類號:TP311文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2008)14-20883-03

        我們在利用ASP.NET進(jìn)行編成時(shí),尤其對數(shù)據(jù)庫操作中,往往降低了應(yīng)用程序的性能,在此,提出了一些方法,僅供參考。

        1 數(shù)據(jù)庫查詢時(shí)一次返回多個(gè)結(jié)果集

        ASP.NET應(yīng)用程序一般都需要用到數(shù)據(jù)庫,進(jìn)行數(shù)據(jù)查詢時(shí)如果次數(shù)過多,每次往返都會降低應(yīng)用程序可以提供的每秒請求數(shù)量。通過在一個(gè)數(shù)據(jù)庫請求中返回多個(gè)結(jié)果集,可以節(jié)省與數(shù)據(jù)庫進(jìn)行通信所需的總時(shí)間長度。同時(shí)因?yàn)闇p少了數(shù)據(jù)庫服務(wù)器管理請求的工作,還會使得系統(tǒng)伸縮性更強(qiáng)。雖然可以使用動態(tài) SQL 返回多個(gè)結(jié)果集,但是最好使用存儲過程。并通過使用 SqlCommand 實(shí)例及其 ExecuteReader 方法輸出結(jié)果,可以通過調(diào)用其NextResult 方法,將結(jié)果集指針向前移動,從而使用不同的結(jié)果集。同時(shí)注意,只從數(shù)據(jù)庫返回需要的數(shù)據(jù),進(jìn)一步減少服務(wù)器上的內(nèi)存分配。

        實(shí)例:

        // read the first resultset

        reader = command.ExecuteReader();

        // read the data from that resultset

        while (reader.Read()) {

        suppliers.Add(PopulateSupplierFromIDataReader(reader));}

        // read the next resultset

        reader.NextResult();

        // read the data from that second resultset

        while (reader.Read()) {

        products.Add(PopulateProductFromIDataReader(reader));}

        2 大量數(shù)據(jù)輸出時(shí)的分頁數(shù)據(jù)訪問

        ASP.NET的DataGrid控件具有一個(gè)很好的功能:數(shù)據(jù)分頁支持。在DataGrid中啟用分頁時(shí),一次會顯示固定數(shù)量的記錄。另外,在DataGrid的底部還會顯示分頁UI,以便在記錄之間進(jìn)行導(dǎo)航。該分頁UI可以使要顯示的數(shù)據(jù)之間向前和向后導(dǎo)航,并且一次顯示固定數(shù)量的記錄。

        使用DataGrid的分頁需要所有數(shù)據(jù)均與網(wǎng)格進(jìn)行綁定。例如,如果的數(shù)據(jù)層需要返回所有數(shù)據(jù),那么DataGrid就會基于當(dāng)前頁篩選顯示的所有記錄。如果通過DataGrid進(jìn)行分頁時(shí)返回了100,000個(gè)記錄,那么針對每個(gè)請求會放棄99,975個(gè)記錄(假設(shè)每頁大小為 25 個(gè)記錄)。當(dāng)記錄的數(shù)量不斷增加時(shí),應(yīng)用程序的性能就會受到影響,因?yàn)獒槍γ總€(gè)請求必須發(fā)送越來越多的數(shù)據(jù)。要編寫性能更好的分頁代碼,一個(gè)極佳的方式是使用存儲過程。如下面的例子,只是傳遞頁索引和頁大小。然后就會計(jì)算合適的結(jié)果集,并將其返回。

        返回記錄的總數(shù)可能會根據(jù)所執(zhí)行查詢的不同而有所變化。例如,WHERE子句可用來約束返回的數(shù)據(jù)。為了計(jì)算在分頁UI中顯示的總頁數(shù),必須了解要返回記錄的總數(shù)。例如:

        如果總共有1,000,000條記錄,并且要使用一個(gè)WHERE子句將其篩選為1000條記錄,

        那么分頁邏輯就需要了解記錄的總數(shù)才能正確呈現(xiàn)分頁UI。

        實(shí)例:

        CREATE PROCEDURE northwind_OrdersPaged

        (@PageIndex int,

        @PageSize int)

        AS

        BEGIN

        DECLARE @PageLowerBound int

        DECLARE @PageUpperBound int

        DECLARE @RowsToReturn int

        -- First set the rowcount

        SET @RowsToReturn = @PageSize * (@PageIndex + 1)

        SET ROWCOUNT @RowsToReturn

        -- Set the page bounds

        SET @PageLowerBound = @PageSize * @PageIndex

        SET @PageUpperBound = @PageLowerBound + @PageSize + 1

        -- Create a temp table to store the select results

        CREATE TABLE #PageIndex

        (IndexId int IDENTITY (1,1) NOT NULL,

        OrderID int)

        -- Insert into the temp table

        INSERT INTO #PageIndex (OrderID)

        SELECT

        OrderID

        FROM

        Orders

        ORDER BY

        OrderID DESC

        -- Return total count

        SELECT COUNT(OrderID) FROM Orders

        -- Return paged results

        SELECT

        O.*

        FROM

        Orders O,

        #PageIndex PageIndex

        WHERE

        O.OrderID = PageIndex.OrderID AND

        PageIndex.IndexID > @PageLowerBound AND

        PageIndex.IndexID < @PageUpperBound

        ORDER BY

        PageIndex.IndexID

        END

        3 使用連接池

        在Web應(yīng)用程序和SQL Server之間設(shè)置TCP連接可能是一個(gè)非常消耗資源的操作。使用連接池可以重用數(shù)據(jù)庫連接。不需要針對每個(gè)請求都設(shè)置一個(gè)新的TCP連接,而是只在連接池中沒有任何連接時(shí)才設(shè)置新連接。當(dāng)連接關(guān)閉時(shí),它會返回連接池,在其中它會保持與數(shù)據(jù)庫的連接,而不是完全破壞該TCP連接。

        當(dāng)然,這需要小心是否會出現(xiàn)泄漏連接。當(dāng)完成使用連接時(shí),一定要關(guān)閉這些連接。注意,一定要在完成使用連接時(shí)針對該連接顯式調(diào)用Close或Dispose。不要相信公共語言運(yùn)行庫(CLR)會在預(yù)先確定的時(shí)間清除和關(guān)閉連接。盡管CLR最終會破壞該類,并強(qiáng)制連接關(guān)閉,但是當(dāng)針對對象的垃圾回收真正發(fā)生時(shí),并不能保證。

        要以最優(yōu)化的方式使用連接池,需要遵守一些規(guī)則。

        首先打開連接,執(zhí)行操作,然后關(guān)閉該連接。如果必須如此的話,可以針對每個(gè)請求多次打開和關(guān)閉連接,但是不要一直將連接保持打開狀態(tài)并使用各種不同的方法對其進(jìn)行進(jìn)出傳遞。第二,使用相同的連接字符串(如果使用集成身份驗(yàn)證的話,還要使用相同的線程標(biāo)識)。如果不使用相同的連接字符串,例如根據(jù)登錄的用戶自定義連接字符串,那么將無法得到連接池提供的同一個(gè)優(yōu)化值。如果使用集成身份驗(yàn)證,同時(shí)還要模擬大量用戶,連接池的效率也會大大下降。嘗試跟蹤與連接池相關(guān)的任何性能問題時(shí),.NET CLR數(shù)據(jù)性能計(jì)數(shù)器可能非常有用。

        每當(dāng)應(yīng)用程序連接資源時(shí),如在另一個(gè)進(jìn)程中運(yùn)行的數(shù)據(jù)庫,都應(yīng)該重點(diǎn)考慮連接該資源所花時(shí)間、發(fā)送或檢索數(shù)據(jù)所花時(shí)間,以及往返的數(shù)量,從而進(jìn)行優(yōu)化。優(yōu)化應(yīng)用程序中任何種類的進(jìn)程跳躍都是獲得更佳性能的首要一點(diǎn)。

        4 使用緩存

        提供緩存功能是ASP.NET中非常強(qiáng)大的一種功能。曾看到過某些評測說:ASP.NET程序的性能比SUN的JSP應(yīng)用程序性能快上幾倍,實(shí)際上,該評測程序非常重要的一點(diǎn)就是使用了很多ASP.NET的緩存功能。

        是否應(yīng)該使用緩存有以下幾條規(guī)則:第一,數(shù)據(jù)可能會被頻繁的被使用,這種數(shù)據(jù)可以緩存;第二,數(shù)據(jù)的訪問頻率非常高,或者一個(gè)數(shù)據(jù)的訪問頻率不高,但是它的生存周期很長,這樣的數(shù)據(jù)最好也緩存起來;第三,緩存是有限的,應(yīng)該估計(jì)緩存集的大小。在ASP.NET中,如果緩存過大的話也會報(bào)內(nèi)存溢出錯(cuò)誤,特別是如果緩存大的DataSet對象的時(shí)候。

        使用ASP.NET緩存機(jī)制有兩點(diǎn)需要注意。首先,不要緩存太多項(xiàng)。緩存每個(gè)項(xiàng)均有開銷,特別是在內(nèi)存使用方面。不要緩存容易重新計(jì)算和很少使用的項(xiàng)。其次,給緩存的項(xiàng)分配的有效期不要太短。很快到期的項(xiàng)會導(dǎo)致緩存中不必要的周轉(zhuǎn),并且經(jīng)常導(dǎo)致更多的代碼清除和垃圾回收工作。

        ASP.NET中常用的緩存方式有:

        4.1 頁面緩存(對整個(gè)頁面進(jìn)行緩存)

        <%@Page OutputCache VaryByParams=\"classid;page\" Duration=\"3600\"%>

        這樣,可以有效的利用第一次請求里生成的頁面輸出緩存內(nèi)容,3600秒后重新生成一道頁面內(nèi)容。這種技術(shù)其實(shí)也是運(yùn)用一些低層的Cache API來實(shí)現(xiàn)。用頁面輸出緩存有幾個(gè)參數(shù)可以配置,如上面所說的VaryByParams參數(shù),該參數(shù)表示什么時(shí)候觸發(fā)重輸出的條件,也可以指定在Http Get或Http Post 請求模式下緩存輸出。

        例如,當(dāng)設(shè)置該參數(shù)為VaryByParams=\"classid;page\"的時(shí)候,default.aspx?classid=3page=1請求的輸出都會被緩存起來。沒有參數(shù),或不用參數(shù)時(shí)用none。如果傳遞的參數(shù)不止一個(gè),那么即使字符串參數(shù)與值都相同,但排列次序不同,那么在請求頁面時(shí),也將生成不同的緩存頁。例如default.aspx?first=1last=1 和default.aspx?last=1first=1雖然參數(shù)完全相同,但由于排列次序不同,將生成兩個(gè)不同的緩存頁。

        4.2 片斷緩存(對頁面的某一部分,如某個(gè)User Control進(jìn)行緩存)

        <%@ OutputCache Duration=\"60\" VaryByParam=\"TextBox1;TextBox2\"%>

        在ASP.NET中,除了在頁面范圍內(nèi)使用緩存,也還可以針對User Control使用Output Cache參數(shù)實(shí)現(xiàn)對用戶控件的緩存。同樣的,一個(gè)頁面中相同類型的控件也可以有多個(gè)不同的緩存。可以根據(jù)參數(shù)來實(shí)現(xiàn)不同的緩存。頁面緩存和片斷緩存可以同時(shí)使用。

        4.3 數(shù)據(jù)緩存

        數(shù)據(jù)緩存是一種強(qiáng)大而又非常簡單的緩存機(jī)制,它可以在緩存區(qū)中為每個(gè)應(yīng)用程序保存各種對象,這些對象可以根據(jù)http的請求被調(diào)用,但是在各個(gè)不同的應(yīng)用程序中這些對象都是私有的。數(shù)據(jù)緩存是通過Cache類來實(shí)現(xiàn)的。當(dāng)應(yīng)用程序建立時(shí),一個(gè)Cache類就同時(shí)被建立,緩存實(shí)例的生存周期就是應(yīng)用程序的生存周期,它會隨著應(yīng)用程序的重新運(yùn)行而重建,通過Cache類的方法,可以將數(shù)據(jù)對象放入緩存區(qū),然后通過關(guān)鍵字匹配尋找并使用這些對象。Cache類通過一個(gè)借口來控制所有需要緩存的內(nèi)容,包括規(guī)定緩存的時(shí)間和緩存方式,可以通過如下方法添加緩存對象:

        Cache[\"關(guān)鍵字\"] = 關(guān)鍵字的取值;

        然后通過下面的方法來訪問這個(gè)對象:

        string mKeyValue = \"\" ;

        if(Cache[\"關(guān)鍵字\"] != 1)

        {mKeyValue = Cache[\"關(guān)鍵字\"];}

        如果要設(shè)置數(shù)據(jù)緩存的過期依賴條件,需要通過insert或add方法添加緩存。

        示例:

        //設(shè)置

        if (System.Web.HttpContext.Current.Cache[\"myTest\"] == 1)

        System.Web.HttpContext.Current.Cache.Insert(\"myTest\",\"data\",1, DateTime.Now.AddSeconds(300),System.Web.Caching.Cache.NoSlidingExpiration);

        //讀取

        if(System.Web.HttpContext.Current.Cache[\"myTest\"]!=1)

        this.Response.Write(Convert.ToString(System.Web.HttpContext.Current.Cache.Get(\"myTest \")));

        最后要注意,在Web Form調(diào)試期間不能使用緩存,否則對頁面所做的修改在緩存過期之前不會得到顯式加載。正確的做法應(yīng)該是在調(diào)試結(jié)束之后,給需要放入緩存的頁面、用戶控件或?qū)ο蠹由暇彺嬷噶?。最后建立部署和安裝項(xiàng)目,生成安裝數(shù)據(jù)包,發(fā)布產(chǎn)品。

        5 服務(wù)器控件視圖狀態(tài)的使用

        視圖狀態(tài)是用于表示在所生成頁的隱藏輸出字段中存儲一些狀態(tài)數(shù)據(jù)的。當(dāng)該頁返回服務(wù)器時(shí),服務(wù)器可以分析、驗(yàn)證、并將此視圖狀態(tài)數(shù)據(jù)應(yīng)用回該頁的控件樹。視圖狀態(tài)是一個(gè)非常強(qiáng)大的功能,因?yàn)樗试S狀態(tài)與客戶端一起保持,并且它不需要cookie或服務(wù)器內(nèi)存即可保存此狀態(tài)。很多ASP.NET服務(wù)器控件都使用視圖狀態(tài)來保持在與頁元素進(jìn)行交互期間創(chuàng)建的設(shè)置。

        然而使用視圖狀態(tài)也有一些缺點(diǎn)。服務(wù)或請求頁時(shí),它都會增加頁的總負(fù)載。對返回服務(wù)器的視圖狀態(tài)數(shù)據(jù)進(jìn)行序列化或取消序列化時(shí),也會發(fā)生額外的開銷。并且視圖狀態(tài)會增加服務(wù)器上的內(nèi)存分配。

        幾個(gè)服務(wù)器控件有著過度使用視圖狀態(tài)的趨勢,即使在并不需要的情況下也要使用它,其中最著名的是 DataGrid。ViewState屬性的默認(rèn)行為是啟用,但是如果不需要,則可以

        在控件或頁級別關(guān)閉。在控件內(nèi),只需將EnableViewState屬性設(shè)置為1,或者在頁中使用下列設(shè)置即可對其進(jìn)行全局設(shè)置:<%@ Page EnableViewState=\"1\" %>。

        如果不需要回發(fā)頁,或者總是針對每個(gè)請求重新生成頁上的控件,則應(yīng)該在頁級別禁用視圖狀態(tài)。

        參考文獻(xiàn):

        [1] 陳嫻, 劉開文, 王蓉玲. ASP.NET項(xiàng)目開發(fā)實(shí)踐(第2版)[M]. 北京:中國鐵道出版社,2005.

        [2] 廖信彥. ASP.NET交互式Web數(shù)據(jù)庫程序設(shè)計(jì)[M]. 北京:中國鐵道出版社,2004.

        注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文

        一区二区三区不卡免费av| 国产精品麻豆综合在线| 免费人成视频在线观看网站| 日本一本免费一二区| 国产精品免费看久久久无码| 粉嫩小泬无遮挡久久久久久| 国产精品综合色区在线观看| 国产草草影院ccyycom| 久久亚洲精品无码va白人极品| 亚洲va中文字幕无码久久不卡 | 久久天天躁狠狠躁夜夜av浪潮| 7777色鬼xxxx欧美色妇| 亚洲综合久久成人a片| 久久这里只有精品9| 中文字幕永久免费观看| 99在线无码精品秘 入口九色| av东京热一区二区三区| 麻豆国产成人av高清在线| 少妇又骚又多水的视频| 国产av剧情一区二区三区| 日韩精品人妻中文字幕有码| 真人与拘做受免费视频| 久久中文字幕av一区二区不卡| 色琪琪一区二区三区亚洲区| 国产激情视频在线观看首页| 中文字幕精品一区二区的区别| 成午夜福利人试看120秒| 全免费a级毛片免费看网站| 免费人成又黄又爽的视频在线 | 国产高清精品在线二区| 手机在线免费av资源网| 国产极品女主播国产区| 无码国产激情在线观看| 亚洲色成人WWW永久在线观看| 亚洲av中文无码乱人伦在线咪咕 | 日本师生三片在线观看| 国产一区高清在线观看| 国产综合精品| 日韩黑人欧美在线视频观看| 最新国产主播一区二区| 久久日本视频在线观看|