ASP教程之进步ASP功能的22个技能(一)
楼上说交互性不好,太牵强了吧。在微软提供的一套框架中,利用asp做网站,开发效率高,使用人数少,减少不必要的开销。交互性是互动方式,是有开发人员决定的。技能|功能 技能1:将经常使用数据在Web服务器端缓存起来年夜部分的ASP页面都要从背景数据库中提取数据,然后将数据用HTML体例体现出来。
不论你的数据库何等快,从内存中提取数据总比从背景数据库中提取快;从当地硬盘中读取数据一般也比从数据库中快。因而,你能够经由过程在Web服务器端缓存数据来进步功能。
缓存是个典范的以空间调换工夫的买卖。假如你准确的缓存了数据,功能大概会日新月异。要想一个缓存能真正发扬效益,必需缓冲那些经常使用和盘算庞大的数据。装满过时数据的缓冲区只能华侈内存。
不常常变更的数据也是缓存的一个优秀候选者,由于你能够不必体贴同数据库中的数据坚持同步。下拉列表框、援用表、小段DHTML代码,XML字符串、菜单项和站点设置变量(包含数据源名字(DSN),IP地点和Web路径)都是很好的缓存候选者。注重,不单单能够缓存数据自己,还能够缓存数据的体现。假如一个ASP页面很少变更,而且缓存价值对照高(好比,产物列表),能够思索用静态HTML页面。
技能2:用Application工具或Session工具缓存经常使用数据
ASP的Application和Session工具是一个极为便利的在内存中缓存数据的容器。你能够把数据放到Application或Session工具中,这些数据就会在全部HTTP挪用中一向存在。每一个用户有本人的Session工具中的数据,而Application工具中的数据能够在一切用户中共享。
应当在甚么时分将数据装进Application或Session中呢?一般,数据在Application或Session启动的时分装进。要想在Application或Session启动的时分装进数据,必要分离在Global.asa的Application_OnStart()或Session_OnStart()中增加得当的代码;假如Global.asa中没有这两个函数,你能够手工增加。也能够在数据第一次利用的时分将其装进。要想如许,应当在ASP页面中写一些代码(或是写一个可重用的剧本函数)来反省数据是不是存在而且假如数据不存在则将其装进内存。上面是一个典范的功能调剂手艺--LazyEvaluation:
<%
FunctionGetEmploymentStatusList
Dimd
d=Application("EmploymentStatusList")
Ifd=""Then
FetchEmploymentStatusListfunction(notshown)
fetchesdatafromDB,returnsanArray
d=FetchEmploymentStatusList()
Application("EmploymentStatusList")=d
EndIf
GetEmploymentStatusList=d
EndFunction
%>
Similarfunctionscouldbewrittenforeachchunkofdataneeded.
Inwhatformatshouldthedatabestored?Anyvarianttypecanbe
stored,sinceallscriptvariablesarevariants.Forinstance,you
canstorestrings,integers,orarrays.Often,you’llbestoringthe
contentsofanADOrecordsetinoneofthesevariabletypes.Toget
dataoutofanADOrecordset,youcanmanuallycopythedatainto
VBScriptvariables,onefieldatatime.It’sfasterandeasierto
useoneoftheADOrecordsetpersistencefunctionsGetRows(),GetString
()orSave()(ADO2.5).Fulldetailsarebeyondthescopeofthis
article,buthere’safunctionthatdemonstratesusingGetRows()to
returnanarrayofrecordsetdata:
猎取纪录集,前往数组
FunctionFetchEmploymentStatusList
Dimrs
Setrs=CreateObject("ADODB.Recordset")
rs.Open"selectStatusName,StatusIDfromEmployeeStatus",_
"dsn=employees;uid=sa;pwd=;"
FetchEmploymentStatusList=rs.GetRows()将纪录集用数组前往
rs.Close
Setrs=Nothing
EndFunction
AfurtherrefinementoftheabovemightbetocachetheHTMLforthe
list,ratherthanthearray.Here’sasimplesample:
猎取纪录集,前往HTMLOption列表
FunctionFetchEmploymentStatusList
Dimrs,fldName,s
Setrs=CreateObject("ADODB.Recordset")
rs.Open"selectStatusName,StatusIDfromEmployeeStatus",_
"dsn=employees;uid=sa;pwd=;"
s="<selectname=""EmploymentStatus">"&vbCrLf
SetfldName=rs.Fields("StatusName")ADO字段绑定
DoUntilrs.EOF
s=s&"<option>"&fldName&"</option>"&vbCrLf
rs.MoveNext
Loop
s=s&"</select>"&vbCrLf
rs.Close
Setrs=Nothing开释rs
FetchEmploymentStatusList=s用字符串体例前往数据
EndFunction
在准确情形下,你能够将ADO纪录集自己缓存在Application或Session局限,但必需满意上面两个前提:.ADO必需被标志为自在线程模子(Free-threaded).必需利用无毗连纪录集
假如不克不及满意下面两个前提,必定不要缓存纪录集。鄙人面的“不天真的组件”和“不要缓存Connection”两个技能中,我们将会商在Application和Session中保留COM工具的伤害性。
当你在Application或Session中存储数据后,数据将一向保留,晓得你的程序改动它,或是Session过时,或是Web服务从头启动。Whatifthedataneedstobeupdated?手工革新Application数据,能够挪用只要办理员才可会见的用来革新数据的ASP页面;大概按期的经由过程一个函数来周期性的更新数据。上面的例子在缓存数据中保留了一个工夫戳,然后一段工夫以后主动革新数据。
<%
ConstUPDATE_INTERVAL=300革新距离,单元是秒
前往雇员形态列表
FunctionGetEmploymentStatusList
UpdateEmploymentStatus
GetEmploymentStatusList=Application("EmploymentStatusList")
EndFunction
周期性的更新缓存中的数据
SubUpdateEmploymentStatusList
Dimd,strLastUpdate
strLastUpdate=Application("LastUpdate")
If(strLastUpdate="")Or_
(UPDATE_INTERVAL<DateDiff("s",strLastUpdate,Now))Then
Note:twoormorecallsmightgetinhere.Thisisokayand
willsimply
resultinafewunnecessaryfetches(thereisaworkaround
forthis)
FetchEmploymentStatusListfunction(notshown)
fetchesdatafromDB,returnsanArray
d=FetchEmploymentStatusList()
更新Application工具时用Application.Lock()来坚持数据分歧性
Application.Lock
Application("EmploymentStatusList")=Events
Application("LastUpdate")=CStr(Now)
Application.Unlock
EndIf
EndSub
要晓得在Session或Application中缓存年夜数组并非一个太好的办法。在会见数组中的任何元素之前,剧本注释器都必要天生一个一时的全部数组的正本。比方,假如你缓存了一个100,000个字符串元素的数组,用来将邮政编码和外地的天色对应逐一起来,在会见数组中任何一个字符串之前,ASP注释器起首必需复制一切的100,000个天色情形数据到一个一时数组中。在这类情形下,开辟一个组件来贮存天色情形数据或是利用辞书(Dictioary)工具更加符合一点。不外,也不要舍本逐末,数组工具的的查找速率更快。索引一个辞书比索引一个数组慢。你能够因你的情形而宜,选择符合的数据布局。
技能3:在硬盘上缓存数据和HTML页面
偶然,大概有太多的数据缓存在内存中。“太多”是个含混的说法,它取决与Web服务器的内存巨细、缓存项的数量和这些缓存项被会见的频度。不管怎样,假如太多的数据在内存中缓存,能够思索将数据用文本或XML文件缓存到Web服务器的硬盘上。能够将缓存到硬盘上和到内存中分离起来,针对你的站点,找到最优化的战略。
注重,当我们丈量单一ASP页面的功能时,从硬盘上读取数据大概比从数据库中读取慢。可是,缓存可以削减数据库和收集的负载。在高负载的情形下,这将年夜年夜进步整体吞吐量。当被缓存的数据长短常庞大的查询,好比多表毗连或是一个庞大的查询历程或一个十分年夜的纪录集,缓存的效果将十分分明。
ASP和COM供应了一些工具来创建基于硬盘的缓存计划。ADORecordset工具的Save和Open办法能够保留和装进到磁盘上。另有一些用来会见文件的组件:.Scripting.FileSystemObject同意你创立、读取和写进文件。.MSXML,同IE绑缚的微软的XML注释器,撑持保留和装进XML文档。.LookupTable工具是一个用来从磁盘装进复杂列表的十分好的选择。
最初,将数据体现缓存在硬盘上,比缓存数据自己要好。天生的HTML能够一个.htm或.asp文件保留在硬盘上;超连能够间接指向那些文件。你也能够用一些贸易工具,如XBuilder和SQLServer互连网公布特征,来天生和处置HTML文件。别的,也能够用#include将HTML片断包括到ASP文件中;还能够用FileSystemObject来读取HTML文件。
技能4:制止在Application或Session工具中缓存COM工具
固然在Application或Session工具中缓存数据是一个好注重,但缓存COM工具大概带来严峻的成果。在Application或Session工具中缓存经常使用COM工具十分诱人,但十分不幸,良多COM工具,包含那些用VB6.0或初期版本写的组件,假如被缓存到
Application或Session工具中将会招致严峻的功能瓶颈。
出格地,一切非Agile的组件被缓存到Session或Application中时,都将发生功能瓶颈。Agile组件是指聚合了Free-threadedmarshaler(FTM)而且线程模子是Both
(ThreadingModel=Both),或线程模子是Neutral(Netural新呈现在Windows2000
和COM+中)的组件。上面的组件都长短Agile的:
自在线程模子组件(除非他们聚合了FTM)
Apartment线程模子组件
单线程组件
Configured组件(MTS/COM+库和服务包/使用)长短Agile的,除非它们是Neutral线程模子的。Apartment线程模子组件和其他非Agile组件最好是事情在页面局限内(就是说,他们在一个单一ASP页面中创立和烧毁)。
在IIS4.0中,线程模子是Both的组件被看做是Agile的,但在IIS5.0中,他们不再满意Agile的前提。组件线程模子必需是Both的,而且聚合了FTM,才被看做Agile的。假如试图将一个用Server.CreateObject创立的非Agile组件存储到
Application工具中时,IIS5.0将会抛出一个毛病。
当ADO组件被标志为自在线程模子时,ADO纪录集工具能够平安地存储。能够用Makfre15.bat,通常为放在programFilesCommonSystemADO这个文件夹里,将ADO组件标志为自在线程模子。有一点要注重:当用Access作背景数据库时,ADO不克不及被标志为自在线程模子。辞书(Dictionary)组件也是Agile工具。
技能5:不要缓存数据库毗连
缓存ADOConnection工具是一个欠好的战略。假如一个Connection工具被存储在
Application工具中并被一切页面利用,一切页面就会争着利用这个毗连。假如
Connection工具被存储在Session工具中,就要为每一个用户创立一个数据库毗连,这就消减了毗连池的感化,而且增年夜了Web服务器和数据库服务器的压力。能够用在每一个利用ADO的ASP页创立和开释ADO工具来替换缓存数据库毗连;由于IIS内建了数据库毗连池,以是这类办法十分无效。
既然有毗连的纪录集保留了一个数据库毗连的援用,因而也不该该在Application或Session工具中保留有毗连的纪录集。可是,你能够平安的缓存无毗连的纪录集,由于它其实不包括到数据毗连的援用。要想挂断一个纪录集,能够接纳以下两个步骤:
Setrs=Server.CreateObject("ADODB.RecordSet")
rs.CursorLocation=adUseClient 第一步
rs.OpenstrQuery,strProv
将纪录集同数据供应者和数据源挂断
rs.ActiveConnection=Nothing 第二步
技能6:准确地利用Session工具
我们已提到了在Application和Session中缓存数据的优点,上面我们将说一些
Session工具的弱点。在忙碌的站点上利用Session有一些倒霉的中央。忙碌是指这个站点每秒钟要处置数以百计的页面哀求或同时毗连数以千计的并发用户。这个技能对那些必需要程度伸缩的站点--就是说,这些站点用多个服务器来完成负载均衡或容错--十分主要。对小的站点,如公司内网,Session绝对与他损耗的资本来讲,仍是值得一用的。
ASP主动为每一个会见Web服务器的反对创立一个Session工具。每一个Session约莫损耗10K的资本,并使一切的哀求都慢了一点。这个Session在超时周期内一向存在,这个周期通常为20分钟。关于Session来讲最年夜的成绩不是功能而是伸缩才能。Session不是跨Web服务器的;一旦一个Session在某个服务器上创立,它的数据都保留在那儿。
这意味着假如你要在多个Web服务器情况中利用Session,你必需计划一套能利用户老是会见它的Session工具地点的Web服务器的战略;行将一个用户粘到一个Web服务器上。假如Web服务器溃散,由于Session不是永世保留在磁盘上的饿,以是全体“粘”
在其上的用户的Session形态都将丧失。完成“粘Session(stickysession)”的战略包含硬件和软件计划,如Windows2000AdvancedServer中的NetworkLoadBalancing和Cisco的LocalDirector。固然,这些计划其实不完善,都要丧失一些可伸缩性。Application工具也不是跨服务器的,假如你想在多服务器间共享和更新Application数据,你必需利用一个背景数据库。但不管怎样,只读Application数据在多服务器情况中仍是非常有效的。
尽年夜多半义务优先(mission-critical)的站点都想在最少两台Web服务器上公布--假如没有比延伸一般运转工夫更主要的来由的话。因而,在计划阶段,你就要完成“粘Session”,或是复杂地制止Session和其他将用户形态保留在一个自力Web服务器上的形态办理手艺。
假如不利用Session,就将它们封闭;能够经由过程InternetServiceManager(参看ISM文档)封闭你的使用的Session功效。假如决意利用Session,就要用一些办法将他们对功能的影响减到最小。能够将不必要Session的内容(如匡助窗口等)移到一个的封闭了Session的ASP使用中。假如某个单一页面不必要Session,能够将上面的语句放在页面的顶部来克制Session功效:
<%@EnableSessionState=False%>
利用该语句另有一个缘故原由是Session在帧中会发生一个风趣的成绩。ASP包管任什么时候候一个会话只要一个哀求,这就招致假如扫瞄器同时哀求多个页面,统一时候将只要一个ASP哀求可以会见Session;这制止了会见Session工具时发生的多线程成绩;但很不幸,一个帧中的多个页面只能按次的天生,一个接着一个,而不是兵书。用户大概会为多个帧守候较长工夫。以是假如帧中的某个页面没有利用Session,就在页面顶部安排<%@EnableSessionState=False%>语句。
作为利用Session工具的替换,另有良多其他的办法来办理会话形态。对小范围的形态(小于4KB),保举利用Cookies,QueryString变量和埋没表单变量。对大批数据,如购物信息,一个背景数据库多是很好的选择。
技能7:将代码封装到COM工具中
假如有良多VBScript或JScript代码,能够经由过程将代码封装到COM工具中来进步功能。
编译过的代码一般比注释代码运转得快。COM工具能够经由过程“后期绑定”来会见其他COM工具,这比剧本利用的“前期绑定”更高效。
上面是将代码码封装到COM工具中的长处(不单单是功能):
COM工具能够很好地将贸易逻辑同体现逻辑分别
COM工具使代码可重用
用VB,C或VJ写的代码比ASP代码更容易调试
COM工具也有不敷,包含开辟周期长和必要分歧的编程履历等。有一点尤需注重,封装大批ASP代码大概在功能上拔苗助长;这类情形下,创立和挪用COM工具的价值凌驾了编译代码功能上的优点。怎样组合ASP代码和COM组件代码来发生最好功能,常常是个使人头疼的成绩。注重,同WindowsNT4.0/IIS4.0比拟,Windows2000/IIS5.0在剧本和ADO功能上已年夜年夜进步。
技能8:对资本晚猎取,早开释
一般情形下,晚猎取和早开释资本是最好的。这不但合用于COM工具,也合用于文件句柄和其他资本。ADO毗连和纪录集是这项优化战略的次要工具。当利用完一个Recordset工具,应当当即将它开释,而不该比及页面停止。将VBScript变量设成Nothing是最好的办法。同时,开释相干的Command和Connection工具(别忘了在将Connection工具设成Nothing之前挪用Close()办法)。
技能9:历程外实行以功能调换牢靠性
ASP和MTS/COM+都有选项让你来用牢靠性调换功能。当创建和公布你的使用时,你应当了解这项买卖的内情。
ASP选项
ASP使用有三种运转办法可选择。在IIS5.0中,引进“分别级别(isolationlevel)”这个术语来形貌这些选项。三种分别级别分离是:低(Low),中(Medium)和高(High)。
低分别级这类级别被一切版本的IIS撑持,而且速率也是最快的。它在Inetinfo.exe--次要的IIS历程--中运转ASP。假如ASP使用溃散,IIS也将溃散。
(在IIS4.0中,网管必需用诸如InetMon之类的工具来监督IIS,一旦IIS中断,运转批处置文件。IIS5.0引进了“牢靠的重启(reliablerestart)”,会主动从头启动失利的服务器。
平分离级从IIS5.0入手下手引进的新级别,指历程外运转,即ASP运转在IIS历程以外。在平分离级中,一切的ASP使用共享一个历程空间。把多个历程外使用在同个空间中运转,削减了历程的树木。平分离级是IIS5.0的默许级别。
高分别级IIS4.0和IIS5.0都撑持。高分别级也是历程外的。假如ASP溃散了,Web服务器其实不溃散。ASP使用会鄙人个ASP哀求抵达的时分主动重启。每一个被设置为高分别级的ASP使用有本人的历程空间;这将每一个ASP使用回护起来。它的弱点是对每一个ASP使用必要一个分别的历程;这增添了很多资本损耗。
哪一种选项是最好的。在IIS4.0中,历程外运转将使功能急剧下落;在IIS5.0中,很多改善使历程外ASP使用的价值降到最低。现实上,在很多测试中,IIS5.0中的ASP历程外使用比II44.0中的历程内运转都快。但不管怎样,在任何平台上,仍是历程内(低分别级)运转能带来最好的功能。但是,在绝对低点击率或低最年夜吞吐量的情形下,低分别级不会带来任何好处;因而,除非每一个Web服务器必要对付成千上百的页面哀求,否则你不会必要用低分别级。一般,必要在多个设置下举行测试,才干决意利用哪一种设置。
注重:当在历程外运转ASP使用时(中或低分别级),ASP使用运转在NT4上的MTS中或Windows2000的COM+中;就是说,在NT4中,ASP使用运转在Mtx.exe中;在
Windows2000中,ASP使用运转在DllHost.exe中。你能够在义务办理器中看到这些历程在运转。
COM选项
COM组件也有三种设置选项,但不完整对应于ASP的选项。COM组件能够是“无设置的(Unconfigured)”、作为一个库使用(LibraryApplication)或是作为一个服务使用(ServerApplication)。“无设置的”意味着组件不注册到COM+中,组件将在挪用者历程空间中运转;即“历程内”。库使用也是历程内的,但能够从COM+的服务,如平安、事件和高低文撑持,中获益。服务使用则被设置成运转在本人的历程空间内。
“无设置”比库使用有一点优胜性;而库使用比服务使用在功能上更优胜。这是由于库使用和ASP是在统一个历程内的,而服务使用是运转在本人的历程空间里的。历程间挪用比历程内挪用的价值高。一样,在历程间传送如纪录集如许的数据,必要在两个历程间复制一切的数据。
缺点!当利用COM服务使用时,要想在ASP和COM间传送数据,必需包管工具完成了“按值分列(marshall-by-valu)”,大概说MBV。完成了MBV的工具将本身从一个历程复制到另外一个历程。这比上面的办法好:工具留在创立者历程,其他历程反复挪用创立历程来利用工具。无毗连ADO纪录集是MBV,有毗连纪录集就不是。
Scripting.Dictonary工具没有完成MBV,不克不及在历程之间传送。最初,对VB程序员的一个提醒:MBV不是经由过程用ByVal来传送参数。MBV是原始组件作者完成的。
如何做?
保举的用牢靠性调换功能的设置:
在IIS4.0上,用ASP的低分别级,并利用MTS服务包。
在IIS5.0SHANG,用ASP的平分离级,利用COM+的库使用。
技能10:利用OptionExplicit
在.asp文件中利用OptionExplicit。该唆使放在.asp文件的顶部,强迫开辟者在利用任何变量之前必需界说它。很多程序员以为这有助于调试程序,由于它打消了打字毛病的大概(如将MyXMLString=敲成MyXLMString=)
别的一点大概加倍主要:已界说变量比不决义的变量快。ASP每次是用名字来援用不决义变量的;而另外一方面,每一个已界说变量有一个序号,ASP用这个序号来援用已界说变量。既然OptionExplicit强迫变量界说,就包管了一切的变量都是已界说的,会见速率就更快了。
技能11:在子历程和函数中利用当地变量
当地变量是那些在子历程和函数中界说的变量。在函数和子过程当中,会见当地变量比会见全局变量更快。利用当地变量也使代码更洁净,因而只管利用当地变量吧。
楼上说交互性不好,太牵强了吧。在微软提供的一套框架中,利用asp做网站,开发效率高,使用人数少,减少不必要的开销。交互性是互动方式,是有开发人员决定的。 尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性,比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. 我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。 Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) Server:这个表示的服务器,操作服务器的一些东西使用这个,如Server.Mappath转换服务器路径,Server.CreateObject实例化一个组件 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 多看多学多思。多看一些关于ASP的书籍,一方面可以扩展知识面一方面可以鉴借别人是如何掌握、运用ASP的;多学善于关注别人,向同学老师多多学习,不论知识的大小;多思则是要将学到的知识灵活运用。 以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
页:
[1]