|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在CSDN里搜索一下“初学”两字,竟有三百余篇帖子(也许更多)。有些帖子说,有了asp的基础,只要15天就能很熟悉了,我甚感自己的愚钝。更多帖子是向大家请教初学者适合看书。两个多月的时间(当然平常杂事比较多。 1、前往多个数据集
反省你的会见数据库的代码,看是不是存在着要前往屡次的哀求。每次往复下降了你的使用程序的每秒可以呼应哀求的次数。经由过程在单个数据库哀求中前往多个了局集,能够削减与数据库通讯的工夫,使你的体系具有扩大性,也能够削减数据库服务器呼应哀求的事情量。
假如你是用静态的SQL语句来前往多个数据集,那我倡议你用存储历程来替换静态的SQL语句。是不是把营业逻辑写到存储过程当中,这个有点争议。可是我以为,把营业逻辑写到存储历程内里能够限定前往了局集的巨细,减小收集数据的流量,在逻辑层也不必在过滤数据,这是一个功德情。
用SqlCommand对象的ExecuteReader办法前往一个强范例的营业对象,再挪用NextResult办法来挪动数据集指针来定位数据集。示例一演示了一个前往多个ArrayList强范例对象的例子。只从数据库中前往你必要的数据能够年夜年夜的减小你的服务器所耗用的内存。
//readthefirstresultset
reader=command.ExecuteReader();
//readthedatafromthatresultset
while(reader.Read()){
suppliers.Add(PopulateSupplierFromIDataReader(reader));
}
//readthenextresultset
reader.NextResult();
//readthedatafromthatsecondresultset
while(reader.Read()){
products.Add(PopulateProductFromIDataReader(reader));
}
2、对数据举行分页
ASP。NET的DataGrid有一个十分有效的功效:分页。假如DataGrid同意分页,在某一时候它只下载某一页的数据,别的,它有一个数据分页的济览导航栏,它让你能够选择扫瞄某一页,并且每次只下载一页的数据。
可是它有一个小小的弱点,就是你必需把一切的数据都绑定到DataGrid中。也就是说,你的数据层必需前往一切的数据,然后DataGrid再依据以后页过滤出以后页所必要的数据显现出来。假如有一个一万笔记录的了局集要用DataGrid举行分页,假定DataGrid每页只显现25条数据,那就意味着每次哀求都有9975条数据都是要抛弃的。每次哀求都要前往这么年夜的数据集,对使用程序的功能影响长短常年夜的。
一个好的办理计划是写一个分页的存储历程,例子2是一个用于对Northwind数据库orders表的分页存储历程。你只必要传以后页码,每页显现的条数两个参数出去,存储历程会前往响应的了局。
在服务器端,我专门写了一个分页的控件来处置数据的分页,在这里,我用了第一个办法,在一个存储历程内里前往了两个了局集:数据纪录总数和请求的了局集。
前往的纪录总数取决于要实行查询,比方,一个where前提能够限定前往的了局集的巨细。由于在分页界面中必需要依据数据集纪录的巨细来盘算总的页数,以是必需要前往了局集的纪录数。比方,假如一共有1000000笔记录,假如用where前提就能够过滤成只前往1000笔记录,存储历程的分页逻辑应当晓得前往那些必要显现的数据。
--PagingThroughtheOrdersTable
CREATEPROCEDUREnorthwind_OrdersPaged
(
@PageIndexint,
@PageSizeint
)
AS
BEGIN
DECLARE@PageLowerBoundint
DECLARE@PageUpperBoundint
DECLARE@RowsToReturnint
--Firstsettherowcount
SET@RowsToReturn=@PageSize*(@PageIndex+1)
SETROWCOUNT@RowsToReturn
--Setthepagebounds
SET@PageLowerBound=@PageSize*@PageIndex
SET@PageUpperBound=@PageLowerBound+@PageSize+1
--Createatemptabletostoretheselectresults
CREATETABLE#PageIndex
(
IndexIdintIDENTITY(1,1)NOTNULL,
OrderIDint
)
--Insertintothetemptable
INSERTINTO#PageIndex(OrderID)
SELECT
OrderID
FROM
Orders
ORDERBY
OrderIDDESC
--Returntotalcount
SELECTCOUNT(OrderID)FROMOrders
--Returnpagedresults
SELECT
O.*
FROM
OrdersO,
#PageIndexPageIndex
WHERE
O.OrderID=PageIndex.OrderIDAND
PageIndex.IndexID>@PageLowerBoundAND
PageIndex.IndexID<@PageUpperBound
ORDERBY
PageIndex.IndexID
END
3、毗连池
用TCP来毗连你的使用程序与数据库是一件高贵的事变(很费时的事变),微软的开辟者能够经由过程用毗连池来重复的利用数据库的毗连。比起每次哀求都用TCP来连一次数据库,毗连池只要在不存在无效的毗连时才新建一个TCP毗连。当封闭一个毗连的时分,它会被放到池中,它仍旧会坚持与数据库的毗连,如许就能够削减与数据库的TCP毗连次数。
固然,你要注重那些健忘关的毗连,你应在每次用完毗连后即刻封闭它。我要夸大的是:不管甚么人说.netframework中的GC(渣滓搜集器)总会在你用完毗连对象后挪用毗连对象的Close大概Dispose办法显式的封闭你的毗连。不要希冀CLR会在你设想的工夫内关失落毗连,固然CLR终极都要烧毁对象和封闭边接,可是我们其实不能断定它究竟会在甚么时分做这些事变。
要用毗连池优化,有两条划定规矩,第一,翻开毗连,处置数据,然后封闭毗连。假如你必需在每次哀求中屡次翻开或封闭毗连,这好过一向翻开一个边接,然后把它传到各个办法中。第二,用不异的毗连字符串(大概用不异的用户标识,当你用集成认证的时分)。假如你没有效不异的毗连字符串,如你用基于登任命户的毗连字符串,这将不克不及使用毗连池的优化功效。假如你用的是集成的论证,由于用户良多,以是你也不克不及充实使用毗连池的优化功效。.NETCLR供应了一个数据功能计数器,它在我们必要跟踪程序功能特征的时分十分有效,固然也包含毗连池的跟踪了。
不管你的使用程序甚么时分要连在另外一台机子的资本,如数据库,你都应当重点优化你连资本所花的工夫,吸收和发送数据的工夫,和往复回之间的次数。优化你的使用程序中的每个处置点(processhop),它是进步你的使用的功能的起点。
使用程序层包括与数据层毗连,传送数据到响应的类的实例和营业处置的逻辑。比方,在CommunityServer中,要组装一个Forums大概Threads汇合,然后使用营业逻辑,如受权,更主要的,这里要完成缓存逻辑。
4、ASP.NET缓存API
在写使用程序之前,你要做的第一件事是让使用程序最年夜化的使用ASP.NET的缓存功效。
假如你的组件是要在Asp.net使用程序中运转,你只需把System.Web.dll援用到你的项目中就能够了。然后用HttpRuntime.Cache属性便可会见Cache了(也能够经由过程Page.Cache或HttpContext.Cache会见)。
有以下几条缓存数据的划定规矩。第一,数据大概会被频仍的被利用,这类数据能够缓存。第二,数据的会见频次十分高,大概一个数据的会见频次不高,可是它的保存周期很长,如许的数据最好也缓存起来。第三是一个经常被疏忽的成绩,偶然候我们缓存了太多半据,一般在一台X86的机子上,假如你要缓存的数据凌驾800M的话,就会呈现内存溢出的毛病。以是说缓存是无限的。换名话说,你应当估量缓存集的巨细,把缓存集的巨细限定在10之内,不然它大概会出成绩。在Asp.net中,假如缓存过年夜的话也会报内存溢堕落误,出格是假如缓存年夜的DataSet对象的时分。
这里有几个你必需懂得的主要的缓存机制。起首是缓存完成了“比来利用”准绳(aleast-recently-usedalgorithm),当缓存少的时分,它会主动的强迫扫除那些无用的缓存。其次“前提依附”强迫扫除准绳(expirationdependencies),前提能够是工夫,关头字和文件。以工夫作为前提是最经常使用的。在asp.net2.0中增添一更强的前提,就是数据库前提。当数据库中的数据产生变更时,就会强迫扫除缓存。要更深切的懂得数据库前提依附请看DinoEsposito在MSDN杂志2004年七月刊的CuttingEdge专栏文章。Asp.net的缓存架构以下图所示:
<br>
5、预哀求缓存
在后面,我提到过即便我们只对某些中央作了一个小小的功能改善也能够取得年夜的功能提拔,我十分喜好用预哀求缓存来提拔程序的功能。
固然CacheAPI计划成用来保留某段工夫的数据,而预哀求缓存只是保留某个时代的某个哀求的内容。假如某个哀求的会见频次高,并且这个哀求只必要提取,使用,修正大概更新数据一次。那末就能够预缓存该哀求。我们举个例子来讲明。
在CS的论坛使用程序中,每个页面的服务器控件都请求失掉用于决意它的皮肤(skin)的自界说的数据,以决意用哪一个款式表及别的的一些本性化的工具。这内里的某些数据大概要长工夫的保留,有些工夫则否则,如控件的skin数据,它只必要使用一次,尔后就能够一向利用。
要完成预哀求缓存,用Asp.net的HttpContext类,HttpContext类的实例在每个哀求中创立,在哀求时代的任何中央都能够经由过程HttpContext.Current属性会见。HttpContext类有一个Items汇合属性,在哀求时代一切的对象和数据都被增加到这个汇合中缓存起来。和你用Cache缓存会见频次高数据一样,你能够用HttpContext.Items缓存那些每一个哀求都要用到的基本数据。它面前的逻辑很复杂:我们向HttpContext.Items中增加一个数据,然后再从它内里读出数据。
6、背景处置
经由过程下面的办法你的使用程序应当运转得很快了,是否是?可是在某些时分,程序中的一次哀求中大概要实行一个十分耗时的义务。如发送邮件大概是反省提交的数据的准确性等。
当我们把asp.netForums1.0集成在CS中的时侯,发明提交一个新的帖子的时分会十分的慢。每次新增一个帖子的时侯,使用程序起首要反省这个帖子是否是反复提的,然后用“badword”过滤器来过滤,反省图片附加码,作帖子的索引,把它增加到符合的行列中,考证它的附件,最初,发邮件到它的定阅者邮件箱中。明显,这个事情量很年夜。
了局是它把大批的工夫都花在做索引和发送邮件中了。做帖子的索引是一项很耗时的操纵,而发邮件给定阅都必要毗连到SMTP服务,然后给每个定阅者都发一封邮件,跟着定阅用户的增添,发送邮件的工夫会更长。
索引和发邮件其实不必要在每次哀求时触发,幻想形态下,我们想要批量的处置这些操纵,每次只发25封邮件大概每隔5分钟把一切的要发的新邮件发一次。我们决意利用与数据库原型缓存一样的代码,可是失利了,以是又不能不回到VS.NET2005。
我们在System.Threading定名空间下找到了Timer类,这个类十分有效,但却很少有人晓得,Web开辟职员则更少有人晓得了。一旦他建了该类的实例,每隔一个指定的工夫,Timer类就会从线程池中的一个线程中挪用指定的回调函数。这意味着你的asp.net使用程序能够在没有哀求的时分也能够运转。这就是后以处置的办理计划。你就能够让做索引和发邮件事情在背景运转,而不是在每次哀求的时分必需实行。
背景运转的手艺有两个成绩,第一是,当你的使用程序域卸载后,Timer类实例就会中断运转了。也就是不会挪用回调办法了。别的,由于CLR的每一个历程中都有很多的线程在运转,你将很难让Timer取得一个线程来实行它,大概能实行它,但会延时。Asp.net层要只管少的利用这类手艺,以削减历程中线程的数目,大概只让哀求用一小部分的线程。固然假如你有大批的异步事情的话,那就只能用它了。
你能够从http://www.rob-howard.net/中下载示例程序,请下载BlackbeltTechEd2004的示例程序。
7、页面输入缓存和代办署理服务
Asp.net是你的界面层(大概说应当是),它包括页面,用户控件,服务器控件(HttpHandlers和HttpModules)和它们天生的内容。假如你有一个Asp.net页面用来输入html,xml,imgae大概是别的的数据,对每个哀求你都用代码来天生不异的输入内容,你就很有需要思索用页面输入缓存了。
你只需复杂的把上面的这一行代码复制到你的页面中就能够完成了:<%@PageOutputCacheVaryByParams=”none”Duration=”60”%>你就能够无效的使用第一次哀求里天生的页面输入缓存内容,60秒后从头天生一道页面内容。这类手艺实在也是使用一些低层的CacheAPI来完成。用页面输入缓存有几个参数能够设置,如下面所说的VaryByParams参数,该参数暗示甚么时分触发重输入的前提,也能够指定在HttpGet或HttpPost哀求形式下缓存输入。比方当我们设置该参数为VaryByParams=”Report”的时分,default.aspx?Report=1大概default.aspx?Report=2哀求的输入城市被缓存起来。参数的值能够是多个用分号离隔参数。
很多人都没无意识到当用页面输入缓存的时分,asp.net也会天生HTTP头集(HTTPHeader)保留鄙人游的缓存服务器中,这些信息能够用于MicrosoftInternet平安性中和减速服务器的呼应速率。当HTTP缓存的头被重置时,哀求的内容会被缓在收集资本中,当客户端再次哀求该内容时,就不会再从源服务器上取得内容了,而间接从缓存中取得内容。
固然用页面输入缓存不进步你的使用程序功能,可是它能削减了从的服务器中加载已缓存页面内容的次数。固然,这仅限于缓存匿名用户能够会见的页面。由于一旦页面被缓存后,就不克不及再实行受权操纵了。
8、用IIS6.0的KernelCaching
假如你的使用程序没用运转在IIS6.0(windowsserver2003)中,那末你就得到了一些很好的进步使用程序功能的办法。在第七个办法中,我讲了用页面输入缓存进步使用程序的功能的办法。在IIS5.0中,当一个哀求到离开IIS后,IIS会把它转给asp.net,当使用了页面输入缓存时,ASP.NET中的HttpHandler会接到该哀求,HttpHandler从缓存中把内容掏出来并前往。
假如你用的是IIS6.0,它有一个十分好的功效就是KernelCaching,并且你不用修正asp.net程序中任何代码。当asp.net接到一个已缓存的哀求,IIS的KernelCache会从缓存中失掉它的一份拷贝。当从收集中传来一个哀求的时,Kernel层会失掉该哀求,假如该哀求被缓存起来了,就间接把缓存的数据前往,如许就竣工了。这就意味着当你用IIS的KernelCaching来缓存页面输入时,你将取得不成相信的功能提拔。在开辟VS.NET2005的asp.net时有一点,我是专门负asp.net功能的程序司理,我的程序员用了这个办法,我看了一切日报表数据,发明用kernelmodelcaching的了局老是最快的。它们的一个配合的特性就是收集的哀求和呼应量很年夜,但IIS只占用了5%的CPU资本。这是使人惊异的。有很多让你利用用IIS6.0的来由,但kernelcashing是最好的一个。
9、用Gzip紧缩数据
除非你的CPU占用率太高了,才有需要用提拔服务器功能的技能。用gzip紧缩数据的办法能够削减你发送到服务真个数据量,也能够进步页面的运转速率,同时也削减了收集的流量。怎样更好的紧缩数据取决于你要发送的数据,另有就是客户真个扫瞄器支不撑持(IIS把用gzip紧缩后的数据发送到客户端,客户端要撑持gzip才干剖析,IE6.0和Firefox都撑持)。如许你的服务器每秒能多呼应一些哀求,一样,你也削减了发送呼应的数据量,也就可以多发送一些哀求了。
好动静,gzip紧缩已被集成在IIS6.0中了,它比IIS5.0中gzip更好。不幸的是,在IIS6.0中启用gzip紧缩,你不克不及在IIS6.0的属性对话中设置。IIS开辟团队把gzip紧缩功效开辟出来了,但他们却忘了在办理员窗口中让办理员能很便利的启用它。要启用gzip紧缩,你只能深切IIS6.0的xml设置文件中修正它的设置。
除浏览本文之外,只好再看看BradWilson写的IIS6紧缩一文:http://www.dotnetdevs.com/articles/IIS6compression.aspx;别的另有一篇先容aspx紧缩基本常识的文章,EnableASPXCompressioninIIS。可是要注重,在IIS6中静态紧缩和kernelcashing是互斥的。
10、服务器控件的ViewState
ViewState是asp.net中的一个特征,它用于把天生页面要用的一形态值保留在一个埋没域中。当页面被回传到服务器时,服务器要剖析,校验和使用ViewState中的数据以复原页面的控件树。ViewState是一个十分有效的特征,它能耐久化客户真个形态而不必cookie大概服务器的内存。年夜部分的服务器控件都是用ViewState来耐久化那些在页面中与用户交互的元素的形态值。比方,用以保留用于分页确当前页的页码。
用ViewState会带来一些负面的影响。起首,它加年夜的服务器的呼应和哀求的工夫。其次,每次回传时都增添了序列化和反序列化数据的工夫。最初,它还损耗了服务器更多的内存。
很多的服务器控件很趋于利用ViewState,如尽人皆知的DataGrid,而偶然候是没有必需利用的。默许情形下是同意利用ViewState的,假如你不想利用ViewState的话,你能够在控件或页面级别把封闭它。在控件中,你只需把EnableViewState属性设为False就能够了;你也能够在页面中设置,使它的局限扩大到全部页面中:<%@PageEnableViewState=”false”%>假如页面无需回传大概每次哀求页面只是出现控件。你就应当在页面级别中把ViewState关失落。
英文原文链接:http://msdn.microsoft.com/zh-cn/magazine/cc163854(en-us).aspx
感觉很多控件都必须自己去写代码;用了WebMatrix感觉也不是很好,毕竟没有很强的WYSIWYG效果。现在就不知道如何是好了。 |
|