《net网站优化》word版_第1页
《net网站优化》word版_第2页
《net网站优化》word版_第3页
《net网站优化》word版_第4页
《net网站优化》word版_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.net网站优化一、数据库操作1、用完马上关闭数据库连接访问数据库资源需要创立连接、翻开连接和关闭连接几个操作。这些过程需要屡次与数据库交换信息以通过身份验证,比较消耗效劳器资源。ASP.NET中提供了连接池Connection Pool改善翻开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接恳求。连接池的大小是有限的,假设在连接池到达最大限度后仍要求创立连接,必然大大影响性能。因此,在建立数据库连接后只有在真正需要操作时才翻开连接,使用完毕后马上关闭,从而尽量减少数据库连接翻开的时间,防止出现超出连接限制的情况。用推荐usingSql

2、Connection Conn=new SqlConnectionconnstr/不必显示关闭或tryconn.Open;catchfinallyconn.Close;2、尽量使用存储过程,并优化查询语句存储过程是存储在效劳器上的一组预编译的SQL语句,类似于DOS系统中的批处理文件。存储过程具有对数据库立即访问的功能,信息处理极为迅速。使用存储过程可以防止对命令的屡次编译,在执行一次后其执行规划就驻留在高速缓存中,以后需要时只需直接调用缓存中的二进制代码即可。在.NET Framework提供的所有数据访问方法中,基于SQL Server的数据访问是生成高性能、可缩放Web应用程序的推荐选择

3、。使用托管SQL Server提供程序时,可通过使用编译的存储过程而不是特殊查询获得额外的性能进步。另外,存储过程在效劳器端运行,独立于ASP.NET程序,便于修改,最重要的是它可以减少数据库操作语句在网络中的传输。优化查询语句ASP.NET中ADO连接消耗的资源相当大,SQL语句运行的时间越长,占用系统资源的时间也越长。因此,尽量使用优化过的SQL语句以减少执行时间。比方,不在查询语句中包含子查询语句,尽量只返回有用的数据、字段,充分利用索引等。3、只读数据访问用SqlDataReader,不要使用DataSet SqlDataReader类提供了一种读取从SQL Server数据库检索的只

4、进数据流的方法。假设当创立ASP.NET应用程序时出现允许您使用它的情况,那么SqlDataReader类提供比DataSet类更高的性能。情况之所以这样,是因为SqlDataReader使用SQL Server的本机网络数据传输格式从数据库连接直接读取数据。另外,SqlDataReader类实现IEnumerable接口,该接口也允许您将数据绑定到效劳器控件。DataSet作为一个功能强大的、支持离线的数据库,其对性能的开销也相对较大。Sqldataread优点:读取数据非常快。假设对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多。缺点:直

5、到数据读完才可close掉于数据库的连接。Dataset是把数据读出,缓存在内存中。缺点:对内存的占用较高。假设对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作。优点:只需连接一次就可close于数据库的连接。一般情况下,读取大量数据,对返回数据不做大量处理用SqlDataReader.对返回数据大量处理用datset比较适宜.对SqlDataReader和Dataset的选择取决于程序功能的实现。4、数据的绑定DataBinder一般的绑定方法%#DataBinder.EvalContainer.DataItem,"字段名"%用DataBind

6、er.eval绑定不必关心数据来源read或dataset。不必关心数据的类型eval会把这个数据对象转换为一个字符串。在底层绑定做了很多工作,使用了反射性能。正因为使用方便了,但却影响了数据性能。来看下%#DataBinder.EvalContainer.DataItem,"字段名"%。当于dataset绑定时,DataItem其实式一个DataRowView假设绑定的是一个数据读取器dataread它就是一个IdataRecord。因此直接转换成DataRowView的话,将会给性能带来很大提升。%#ctypeContainer.DataItem,DataRowView

7、.Row"字段名"%对数据的绑定建议使用%#ctypeContainer.DataItem,DataRowView.Row"字段名"%。使用时注意两个方面:1.需在页面添加%Import namespace="System.Data"%.2.注意字段名的大小写要特别注意。假设和查询的不一致,在某些情况下会导致比%#DataBinder.EvalContainer.DataItem,"字段名"%还要慢。假设想进一步进步速度,可采用%#ctypeContainer.DataItem,DataRowView.Row0%的

8、方法。不过其可读性不高。以上的是的写法。在c#中:%#DataRowViewContainer.DataItem"字段名"%5、返回多个结果集无论SqlDataReader还是datset,返回多个结果集,然后用rd.NextResult或ds.Tablesi来分别处理数据,减少重复连接数据库的次数。同时尽量用比较高效的SQL代替后续复杂的DataSet二次加工。二、页面优化1、不使用不必要的效劳器控件Server ControlASP.net中,大量的效劳器端控件方便了程序开发,但也可能带来性能的损失,因为用户每操作一次效劳器端控件,就产生一次与效劳器端的往返过程。因此,

9、非必要,应当少使用Server Control。还有许多其他情况,在这些情况中呈现或数据绑定比使用效劳器控件更有效,甚至是在使用效劳器控件模板时。但是,假设要以编程方式操作效劳器控件的属性、处理效劳器控件事件或利用视图状态保存,那么使用效劳器控件是适当的。所以,尽量选择html控件。能在客户端实现的功能就在客户端实现纯熟掌握javascript,减少效劳器的压力。2、不使用不必要的ViewState默认情况下,ASP.Net对所有的Server Control都启用了ViewState视图状态。但ViewState需要在客户端保存一些信息,这会造成性能的消耗。当必须使用Server Contr

10、ol时,可以考虑制止ViewState。只在必要时保存效劳器控件视图状态。自动视图状态管理是效劳器控件的功能,该功能使效劳器控件可以在往返过程上重新填充它们的属性值您不需要编写任何代码。但是,因为效劳器控件的视图状态在隐藏的窗体字段中往返于效劳器,所以该功能确实会对性能产生影响。您应该知道在哪些情况下视图状态会有所帮助,在哪些情况下它影响页的性能。例如,假设您将效劳器控件绑定到每个往返过程上的数据,那么将用从数据绑定操作获得的新值交换保存的视图状态。在这种情况下,禁用视图状态可以节省处理时间。默认情况下,为所有效劳器控件启用视图状态。假设要禁用视图状态,请将控件的EnableViewState

11、属性设置为false,如下面的DataGrid效劳器控件例如所示。asp:datagrid EnableViewState="false"runat="server"/您还可以使用Page指令禁用整个页的视图状态。当您不从页回发到效劳器时,这将非常有用:%Page EnableViewState="false"%注意Control指令中也支持EnableViewState属性,该指令允许您控制是否为用户控件启用视图状态。假设要分析页上效劳器控件使用的视图状态的数量,请通过将trace="true"属性包括在Page

12、指令中启用该页的跟踪并查看Control Hierarchy表的Viewstate列。3、防止到效劳器的不必要的往返过程虽然您很可能希望尽量多地使用Web窗体页框架的那些节省时间和代码的功能,但在某些情况下却不宜使用ASP.NET效劳器控件和回发事件处理。通常,只有在检索或存储数据时,您才需要启动到效劳器的往返过程。多数数据操作可在这些往返过程间的客户端上进展。例如,从HTML窗体验证用户输入经常可在数据提交到效劳器之前在客户端进展。通常,假设不需要将信息传递到效劳器以将其存储在数据库中,那么您不应该编写导致往返过程的代码。假设您开发自定义效劳器控件,请考虑让它们为支持ECMAScript的阅

13、读器呈现客户端代码。通过以这种方式使用效劳器控件,您可以显著地减少信息被不必要的发送到Web效劳器的次数。使用Page.IsPostBack防止对往返过程执行不必要的处理假设您编写处理效劳器控件回发处理的代码,有时可能需要在首次恳求页时执行其他代码,而不是当用户发送包含在该页中的HTML窗体时执行的代码。根据该页是否是响应效劳器控件事件生成的,使用Page.IsPostBack属性有条件地执行代码。例如,下面的代码演示如何创立数据库连接和命令,该命令在首次恳求该页时将数据绑定到DataGrid效劳器控件。void Page_LoadObject sender,EventArgs eif!Pag

14、e.IsPostBack由于每次恳求时都执行Page_Load事件,上述代码检查IsPostBack属性是否设置为false。假设是,那么执行代码。假设该属性设置为true,那么不执行代码。注意假设不运行这种检查,回发页的行为将不更改。Page_Load事件的代码在执行效劳器控件事件之前执行,但只有效劳器控件事件的结果才可能在输出页上呈现。假设不运行该检查,仍将为Page_Load事件和该页上的任何效劳器控件事件执行处理。4、当不使用会话状态时禁用它,并且程序开发中尽量少用Session并不是所有的应用程序或页都需要针对于详细用户的会话状态,您应该对任何不需要会话状态的应用程序或页禁用会话状态

15、。假设要禁用页的会话状态,请将Page指令中的EnableSessionState属性设置为false。例如:%Page EnableSessionState="false"%注意假设页需要访问会话变量,但不打算创立或修改它们,那么将Page指令中的EnableSessionState属性设置为ReadOnly。假设要禁用应用程序的会话状态,请在应用程序Web.config文件的sessionstate配置节中将mode属性设置为off。例如:sessionstate mode="off"/5、合理使用DataGrid在2.0中为GridView控件Da

16、taGrid控件带有最强大的数据显示功能,还内置了对数据的修改、删除、添加、分页等很多功能。假设只需简单的显示数据,DataGrid并非最正确选择。DataGrid控件的分页功能,数据的存储方式存储在viewstate中等,虽然让程序开发者使用方便快捷,但由此产生的性能开销不容小视。DataList控件比DataGrid功能少了很多。但自定义性强了很多。特有的多行数据显示还是比较方便的。DataGrid能实现的功能,它根本能实现。Repeater控件功能最少,但自定义性非常强。由于减少了很多功能,对效劳器的性能带来消耗最小。因此,在只需简单显示数据列表时,选择Repeater或DataList

17、控件同样可以到达目的,而且减轻了性能上的开销。建议选择顺序:Repeater然后DataList最后DataGridGridView6、对数据进展分页ASP.NET的DataGrid在2.0中为GridView有一个非常有用的功能:分页。假设DataGrid允许分页,在某一时刻它只下载某一页的数据,另外,它有一个数据分页的阅读导航栏,它让你可以选择阅读某一页,而且每次只下载一页的数据。但是它有一个小小的缺点,就是你必须把所有的数据都绑定到DataGrid中。也就是说,你的数据层必须返回所有的数据,然后DataGrid再根据当前页过滤出当前页所需要的数据显示出来。假设有一个一万条记录的结果集要用

18、DataGrid进展分页,假设DataGrid每页只显示25条数据,那就意味着每次恳求都有9975条数据都是要丢弃的。每次恳求都要返回这么大的数据集,对应用程序的性能影响是非常大的。一个好的解决方案是写一个分页的存储过程,如:CREATE PROCEDURE dbo.sp_DataPagesSql nVARCHAR2000,PK varchar50,-主键字段名可以是任何数据类型;不能,并且也不需要带表名前缀,如:不可以是users.idOrder varchar50,-排序方式带desc或asc,可以是多个组合;不能,并且也不需要带表名前缀,如:不可以是users.id descPage i

19、nt,PageSize int=30 AS set nocount on DECLAREStr nVARCHAR4000ifPage=1SETStr='Select Top'+CASTPageSizeAs VARCHAR20+'*From'+Sql+'As table1 Order By table1.'+Order else SETStr='Select Top'+CASTPageSizeAs VARCHAR20+'*From'+Sql+'As table1 Where table1.'+PK+&

20、#39;Not InSelect Top'+CASTPageSize*Page-1AS VARCHAR20+''+PK+'From'+Sql+'As table2 Order By table2.'+Order+'Order By table1.'+Order-printstr-execStrEXEC sp_ExecuteSqlStr set nocount off GO或者,使用sql server 2005中的row_number函数declaresql varchar8000setsql='select*&#

21、39;+'from'+''+'select row_numberoverorder by id descas rowNumber,*'+'from Users'+'where id 0and name'''''+''+'as table1'+'where rowNumber between'+strpage-1*pagesize+1+'AND'+strpage*pagesize+'order by id desc

22、'-execsqlEXEC sp_ExecuteSqlsql小技巧:将记录总数保为Cache或Session来进步分页性能。7、不要禁用Web窗体页的缓冲除非有特殊的原因要关闭缓冲,否那么使其保持翻开。禁用Web窗体页的缓冲会导致大量的性能开销。启用页面输出的缓冲区Buffer假设Buffer的机制被关闭,可以用下面的方法翻开。使用程序翻开页面输出缓存:Response.BufferOutput=true;使用Page开关翻开页面输出缓冲机制:%Page Buffer="true"%使用Web.config或Machine.config配置文件的pages节点:pa

23、ges buffer="true"/8、设置page的smart navigation属性smart navigation设置为true能让用户明显的感觉性能进步。启用此属性后对客户端和效劳端影响不大.它能智能刷新需要刷新的部分。在大多数情况下不要在代码中设置该属性。在.aspx文件的Page指令中将SmartNavigation属性设置为true。恳求该页时,动态生成的类将设置该属性。Internet Explorer 5或更高版本阅读器恳求页时或稍后,智能导航将通过执行以下功能进步用户对该页的操作才能:消除导航导致的闪烁。从一页挪动到另一页时保持滚动位置。保持导航之间的

24、元素焦点。在阅读器的历史记录中只保存最后一页的状态。智能导航最适用于需要频繁回发,但是其内容在返回时不会发生显著更改的ASP.NET页。在决定是否将该属性设置为true时,请仔细考虑这一点。三、c#或程序改进1、使用值类型的ToString方法在连接字符串时,经常使用"+"号直接将数字添加到字符串中。这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大,因为在进展这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创立的对象中。使用值类型的ToString方法可以防止装箱

25、操作,从而进步应用程序性能。int num=1;string str="go"+num.ToString;2、运用StringBuilder类String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创立了一个String对象并将新值赋予该对象,其方法ToString对性能的进步并非很显著。在处理字符串时,最好使用StringBuilder类,其.NET命名空间是System.Text。该类并非创立新的对象,而是通过Append,Remove,Insert等方法直接对字符串进展操作,通过ToString方法返回操作结果。其定义及操作语句如下所示:int n

26、um;System.Text.StringBuilder str=new System.Text.StringBuilder;/创立字符串str.Appendnum.ToString;/添加数值num Response.Writestr.ToString;/显示操作结果3、使用 ServerUtility.Transfer方法在同一应用程序的页面间重定向采用Server.Transfer语法,在页面中使用该方法可防止不必要的客户端重定向Response.Redirect。4、防止使用ArrayList。因为任何对象添加到ArrayList都要封箱为System.Object类型,从ArrayL

27、ist取出数据时,要拆箱回实际的类型。建议使用自定义的集合类型代替ArrayList。 2.0提供了一个新的类型,叫泛型,这是一个强类型,使用泛型集合就可以防止了封箱和拆箱的发生,进步了性能。5、使用HashTale代替其他字典集合类型如StringDictionary,NameValueCollection,HybridCollection,存放少量数据的时候可以使用HashTable.6、为字符串容器声明常量,不要直接把字符封装在双引号""里面。/防止MyObject obj=new MyObject;obj.Status="ACTIVE";/推荐c

28、onst string C_STATUS="ACTIVE";MyObject obj=new MyObject;obj.Status=C_STATUS;7、不要用ToUpper,ToLower转换字符串进展比较,用String pare代替,它可以忽略大小写进展比较.例:const string C_VALUE="COMPARE";ifString paresVariable,C_VALUE,true=0Console.Write"一样";也可以用str=String.Empty或者str.Length=0判断是否为空。注意判断输入数

29、据的长度,可防止sql注入式攻击将String对象的Length属性与0比较是最快的方法,防止不必要的调用ToUpper或ToLower方法。8、类型转化Int32.TryParse优于Int32.Parse优于Convert.ToInt32。建议.NET1.1下用Int32.Parse;.NET2.0用Int32.TryParse。因为:Convert.ToInt32会把最终的解析工作代理给Int32.Parse;Int32.Parse会把最终的解析工作代理给Number.ParseInt32;Int32.TryParse会把最终的解析工作代理给Number.TryParseInt32。9、

30、假设只是从XML对象读取数据,用只读的XPathDocument代替XMLDocument,可以进步性能/防止XmlDocument xmld=new XmlDocument;xmld.LoadXmlsXML;txtName.Text=xmld.SelectSingleNode"/packet/child".InnerText;/推荐XPathDocument xmldContext=new XPathDocumentnew StringReaderoContext.Value;XPathNavigator xnav=xmldContext.CreateNavigator;

31、XPathNodeIterator xpNodeIter=xnav.Select"packet/child";iCount=xpNodeIter.Count;xpNodeIter=xnav.SelectDescendantsXPathNodeType.Element,false;whilexpNodeIter.MoveNextsCurrValues+=xpNodeIter.Current.Value+",";10、防止在循环体里声明变量,应该在循环体外声明变量,在循环体里初始化。C#程序开发要遵循的一个根本原那么就是防止不必要的对象创立/防止forint

32、 i=0;i 10;i+SomeClass objSC=new SomeClass;/推荐SomeClass objSC=null;forint i=0;i 10;i+objSC=new SomeClass;11、捕获指定的异常,不要使用通用的System.Exception./防止trysome logiccatchException excError handling/推荐trysome logiccatchSystem.NullReferenceException excError handlingcatchSystem.ArgumentOutOfRangeException excEr

33、ror handlingcatchSystem.InvalidCastException excError handling12、使用Try.catch.finally时,要在finally里释放占用的资源如连接,文件流等不然在Catch到错误后占用的资源不能释放。trycatchfinallyconntion.close;13、不要用Exception控制程序流程有些程序员可能会使用异常来实现一些流程控制。例如:tryresult=100/num;CatchException eresult=0;但实际上,Exception是非常消耗系统性能的。除非必要,不应当使用异常控制来实现程序流程。上

34、面的代码应当写为:ifnum!=0result=100/num;else result=0;14、防止使用递归调用和嵌套循环,使用他们会严重影响性能,在不得不用的时候才使用。15、禁用VB.net和Jscript动态数据类型应当始终显示地申明变量数据类型,这可以节约程序的执行时间。以往,开发人员喜欢使用Visual Basic、VBScript和JScript的原因之一就是它们所谓"无类型"的性质。变量不需要显式类型声明,并可以简单地通过使用来创立它们。当从一个类型到另一个类型进展分配时,转换将自动执行。不过,这种便利会大大损害应用程序的性能。如:为了获得最正确的性能,当声

35、明JScript.NET变量时,请为其分配一个类型。例如,var A:String;四、使用缓存1、使用Output Cache缓存数据提供缓存功能是ASP.net中非常强大的一种功能。曾看到过某些评测说:ASP.net程序的性能比SUN的JSP应用程序性能快上几倍,实际上,该评测程序非常重要的一点就是使用了很多ASP.net的缓存功能。假设你的组件是要在A应用程序中运行,你只要把System.Web.dll引用到你的工程中就可以了。然后用 Runtime.Cache属性就可访问Cache了也可以通过Page.Cache或 Context.Cache访问。有以下几条缓存数据的规那么。第一,数据

36、可能会被频繁的被使用,这种数据可以缓存。第二,数据的访问频率非常高,或者一个数据的访问频率不高,但是它的生存周期很长,这样的数据最好也缓存起来。第三是一个常常被忽略的问题,有时候我们缓存了太多数据,通常在一台X86的机子上,假设你要缓存的数据超过800M的话,就会出现内存溢出的错误。所以说缓存是有限的。换名话说,你应该估计缓存集的大小,把缓存集的大小限制在10以内,否那么它可能会出问题。在A中,假设缓存过大的话也会报内存溢出错误,特别是假设缓存大的DataSet对象的时候。这里有几个你必须理解的重要的缓存机制。首先是缓存实现了"最近使用"原那么a least-recentl

37、y-used algorithm,当缓存少的时候,它会自动的强迫去除那些无用的缓存。其次"条件依赖"强迫去除原那么expiration dependencies,条件可以是时间,关键字和文件。以时间作为条件是最常用的。在2.0中增加一更强的条件,就是数据库条件。当数据库中的数据发生变化时,就会强迫去除缓存。使用ASP.NET缓存机制有两点需要注意。首先,不要缓存太多项。缓存每个项均有开销,特别是在内存使用方面。不要缓存容易重新计算和很少使用的项。其次,给缓存的项分配的有效期不要太短。很快到期的项会导致缓存中不必要的周转,并且经常导致更多的代码去除和垃圾回收工作。假设关心此问

38、题,请监视与ASP.NET Applications性能对象关联的Cache Total Turnover Rate性能计数器。高周转率可能说明存在问题,特别是当项在到期前被移除时。这也称作内存压力。切记:应该:应该缓存那些经常被访问、同时变化频率不大的数据应该缓存整个应用程序都要使用的设置或对象,但这些设置和对象必须在其生存期内不会变化不应该:不要缓存个人信息。假设缓存个人信息,其别人很容易获得这些信息。不要缓存包含基于时间值的页面,否那么阅读者将无法理解为何时间总是滞后。不要缓存用户随时都会修改的对象,如购物车。ASP.net中常用的缓存方式有:1页面缓存对整个页面进展缓存%/Respon

39、se.AddHeader"Last-Modified",DateTime.Now.AddHours-1.ToString"r";%Response.AddHeader"Cache-Control","max-age=86400";%/Response.AddHeader"Date",DateTime.Now.AddMinutes-59.ToString"r";%Page OutputCache VaryByParams="classid;page"Dura

40、tion="3600"%.net2.0中为:%OutputCache VaryByParam="classid;page"Duration="3600"%你就可以有效的利用第一次恳求里生成的页面输出缓存内容,3600秒后重新生成一道页面内容。这种技术其实也是运用一些低层的Cache API来实现。用页面输出缓存有几个参数可以配置,如上面所说的VaryByParams参数,该参数表示什么时候触发重输出的条件,也可以指定在 Get或 Post恳求形式下缓存输出。例如当我们设置该参数为VaryByParams="classid;p

41、age"的时候,default.aspx?classid=3&page=1恳求的输出都会被缓存起来。没有参数,或不用参数时用none。假设传递的参数不止一个,那么即使字符串参数与值都一样,但排列次序不同,那么在恳求页面时,也将生成不同的缓存页。例如default.aspx?first=1&last=1和default.aspx?last=1&first=1虽然参数完全一样,但由于排列次序不同,将生成两个不同的缓存页。许多人都没有意识到当用页面输出缓存的时候,也会生成 头集 Header保存在下游的缓存效劳器中,这些信息可以用于Microsoft Interne

42、t平安性中以及加速效劳器的响应速度。当 缓存的头被重置时,恳求的内容会被缓在网络资源中,当客户端再次恳求该内容时,就不会再从源效劳器上获得内容了,而直接从缓存中获得内容。虽然用页面输出缓存不进步你的应用程序性能,但是它能减少了从的效劳器中加载已缓存页面内容的次数。当然,这仅限于缓存匿名用户可以访问的页面。因为一旦页面被缓存后,就不能再执行受权操作了。2片断缓存对页面的某一部分,如某个User Control进展缓存%OutputCache Duration="60"VaryByParam="TextBox1;TextBox2"%在ASP.net中,除了在

43、页面范围内使用缓存,也还可以针对User Control使用Output Cache参数实现对用户控件的缓存。同样的,一个页面中一样类型的控件也可以有多个不同的缓存。可以根据参数来实现不同的缓存。页面缓存和片断缓存可以同时使用。3数据缓存数据缓存是一种强大而又非常简单的缓存机制,它可以在缓存区中为每个应用程序保存各种对象,这些对象可以根据 的恳求被调用,但是在各个不同的应用程序中这些对象都是私有的。数据缓存是通过Cache类来实现的。当应用程序建立时,一个Cache类就同时被建立,缓存实例的生存周期就是应用程序的生存周期,它会随着应用程序的重新运行而重建,通过Cache类的方法,我们可以将数据

44、对象放入缓存区,然后通过关键字匹配寻找并使用这些对象。Cache类通过一个借口来控制所有需要缓存的内容,包括规定缓存的时间和缓存方式,可以通过如下方法添加缓存对象:Cache"关键字"=关键字的取值;然后通过下面的方法来访问这个对象:string mKeyValue="";ifCache"关键字"!=nullmKeyValue=Cache"关键字";注意Page.Cache和 Context.Current.Cache区别:它们指的同一个对象,在Page里,用Page.Cache,假设在global.asax或自己

45、的类里用: Context.Current.Cache,在有些事件中,由于其没有 Context,就用 Runtime.Cache。数据缓存的过期依赖条件某种意义上,Cache和Application是一样的,都是一种公有的对象。为了获得缓存与数据有效性之间的平衡,可以根据需要对缓存过期策略进展合理的设置。文件依赖Cache.Insert"Mydata",Source,New CacheDependencyServer.MapPath"authors.xml";此代码的含义是当authors.xml文件不发生变化的时候,缓存MyData始终有效。时间依赖

46、设定1小时后过期,这是一种绝对过期。Cache.Insert"Mydata",Source,null,DateTime.Now.AddHours1,TimeSpan.Zero;相对过期依赖当DataSet不再发生变化20分钟以后,缓存过期。Cache.Insert"MyData",Source,null,DateTime.MaxValue,TimeSpan.FromMinutes20;一个例如:/绝对过期!用来保存公用的,数据量小的数据对象,可以是任何对象/设置ifSystem.Web. Context.Current.Cache"ok&quo

47、t;=nullSystem.Web. Context.Current.Cache.Insert"ok","data",null,DateTime.Now.AddSeconds300,System.Web.Caching.Cache.NoSlidingExpiration;/读取ifSystem.Web. Context.Current.Cache"ok"!=nullthis.Response.WriteConvert.ToStringSystem.Web. Context.Current.Cache.Get"ok"

48、;最后要注意:在Web Form调试期间不能使用缓存,否那么你对页面所做的修改在缓存过期之前不会得到显式加载。正确的做法应该是在调试完毕之后,给需要放入缓存的页面、用户控件或对象加上缓存指令。最后建立部署和安装工程,生成安装数据包,这时候就可以到效劳器上去发布你的产品了。2、预恳求缓存虽然Cache API设计成用来保存某段时间的数据,而预恳求缓存只是保存某个时期的某个恳求的内容。假设某个恳求的访问频率高,而且这个恳求只需要提取,应用,修改或者更新数据一次。那么就可以预缓存该恳求。我们举个例子来说明。在CS的论坛应用程序中,每一个页面的效劳器控件都要求得到用于决定它的皮肤skin的自定义的数据

49、,以决定用哪个款式表及其它的一些个性化的东西。这里面的某些数据可能要长时间的保存,有些时间那么不然,如控件的skin数据,它只需要应用一次,而后就可以一直使用。要实现预恳求缓存,用A的 Context类, Context类的实例在每一个恳求中创立,在恳求期间的任何地方都可以通过 Context.Current属性访问。 Context类有一个Items集合属性,在恳求期间所有的对象和数据都被添加到这个集合中缓存起来。和你用Cache缓存访问频率高数据一样,你可以用 Context.Items缓存那些每个恳求都要用到的根底数据。它背后的逻辑很简单:我们向 Context.Items中添加一个数据

50、,然后再从它里面读出数据。五、配置web.config 1、一定要禁用调试形式在部署消费应用程序或进展任何性能测量之前,始终记住禁用调试形式。假设启用了调试形式,应用程序的性能可能受到非常大的影响。compilation defaultLanguage="c#"debug="false"/2、必要时调整应用程序每个辅助进程的线程数ASP.NET的恳求构造试图在执行恳求的线程数和可用资源之间到达一种平衡。一个使用足够CPU功率的应用程序,该构造将根据可用于恳求的CPU功率,来决定允许同时执行的恳求数。这项技术称作线程门控。但是在某些条件下,线程门控算法不是

51、很有效。通过使用与ASP.NET Applications性能对象关联的Pipeline Instance Count性能计数器,可以在PerfMon中监视线程门控。当页面调用外部资源,如数据库访问或XML Web services恳求时,页面恳求通常停顿并释放CPU。假设某个恳求正在等待被处理,并且线程池中有一个线程是自由的,那么这个正在等待的恳求将开场被处理。遗憾的是,有时这可能导致Web效劳器上存在大量同时处理的恳求和许多正在等待的线程,而它们对效劳器性能有不利影响。通常,假设门控因子是外部资源的响应时间,那么让过多恳求等待资源,对Web效劳器的吞吐量并无帮助。为缓和这种情况,可以通过更改Machine.config配置文件processModel节点的maxWorkerThreads和maxIOThreads属性,手动设置进程中的线程数限制。注意辅助线程是用来处理ASP.NET恳求的,而IO线程那么是用于为来自文件、数据库或XML

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论