重庆邮电学院学报
JOurna1OfChOnggingUniversityOfPOstsandTe1ecOmmunicatiOns2OO1年6月Jun.2OO1
Web交互式动态页面的优化
摘
要:首先简单介绍创建Web应用程序的ASP基本原理.然后从程序代码和数据库访问控制两个方面
分析介绍了如何优化Web动态网站技术,
关键词:动态服务页面;ActiveX组件对象;连接池;优化中图分类号:TP319
文献标识码:A
OptimizingInteractive-DynamicWebPageS
LVZhi-hu.WANGShu-yi
(BToa Ban netZoTkTechnolog}R8DInstztute.ChonggzngUnzueTszt}ofpostsan Telecommunzcatzons.Chonggzng4OOO65.ChznaD
AbStract:ThispapergivesabriefintrOductiOntOASP sfundamenta1princip1e.andthenana1yseshOWtOOptimiZedynamicWebsitetechnO1OgyfrOmtWOaspectsOfASP scOdeanddatabase saccess-cOn-trO1.
KeywordS:activeserverpages;activedataObject;cOnnectiOnpOO1;OptimiZing
O
引言
Web页面访问.并以ASP(ActiveServerPagesD作
为Web应用服务程序开发接口,
许多机关和企业都建有自己的网络站点.希望在 nternet上发布信息,要想使开发的站点被更多的用户接受.就必须提高网站的访问效率.目前.许多站点大都是从WebServer端和WebBrOWser端或通过改善服务器硬件来提高网站的访问效率,事实上.系统资源和开发程序的优化设计对网站的效率至关重要,没有进行必要优化配置和设计的网站.当用户访问量增加时.会导致页面读取速度下降.数据出错.甚至服务器死机的现象,本文从程序代码设计和数据库访问控制技术2方面分析了如何优化开发的网络站点.以实现快速 高效的交互式动态
1
ASP基本原理
ASP是微软公司推出的一个服务器端脚本编写环境.在站点的Web服务器上解释脚本,开发者可使用几乎所有的开发工具来组合~TML代码.这些脚本可利用本地服务器或远程服务器上运行的组件来存取数据库.应用程序或处理信息,当客户端浏览器向Web服务器请求%.asp文件(ASP文件后缀名为.aspD时.Web服务器响应~TTP请求.调用ASP引擎.解释被申请文件,若脚本指令中含有访问数据库的请求.就通过ODBC与后台数据库相
颗粒机www.ftxny.com木屑颗粒机收稿日期:2OOO1O19
基金项目:该课题为重庆市应用基础研究项目,
作者简介:吕志虎(1975-D.男.河南信阳人.重庆邮电学院宽带网络技术研究所硕士研究生.主要研究方向为宽带网 移
动 P 蓝牙技术;王蜀毅(1962-D.男.重庆人.副教授.主要研究方向为基于 nternet的大型数据库系统.宽带网,
-67-
2001年第2期
重庆邮电学院学报
连,由数据库访问组件访问数据库操作,最后送出标准的~TML格式文件给客户端O其原理如图1O
从图1可看到ASP脚本集成于~TML中,并且容易生成;页面的开发与~TML完全一致,用普通的编辑器即可,无须手动编译和连接即可直接解释执行OASP独立于浏览器,用户端只要使用可解释常规~TML代码的浏览器,即可浏览ASP所设计的主页内容O而且它利用ActiveX组件对象AD0CUPT
据用户对页面请求情况和页面与数据库动态交互情况等条件,决定对某个页面或某个页面的一部分进行动态缓存(该技术是有关Web交互式动态页面的一个比较新的技术,目前还不很完善)O
(3)开发中最好不要使用框架(frame)O框架会增加浏览器对服务器的访问连接请求数,使服务器的负担加重O用ASP的包含语句(iinclude)或将导航区包含在网站的所有页面内,同样可以达到框(ActiveXData0bject),可以很容易存取~操纵各种关系型及非关系型数据库O
Web浏览器~TTP请求~ IIS
~TTP响应
ASPActiveX ~Vbscript调用C0M组件
+解释执行
Database_~AD0ASP文件
图1
ASP原理结构图
2
ASP程序的优化设计方法
合理优化ASP程序代码会大大提高ASP的执
行效率,减少服务器的负担,从而可提高整个网站的效率O可以从以下几个方面优化ASP程序代码O
(1)在ASP编码中尽量少用会话变量(Session)O使用会话变量会降低网站的工作效率,因每个新来的访问者都会创建一个会话变量,且直到用户离开网站20min(Session变量默认的会话结束时间)后,会话变量所占用的内存才被释放O若用会话变量,则最好在ASP注册表中重新设置ASP服务端的系统设置值,来调整会话结束时间及时释放被占用的内存;或者使用Session对象的Aban-don方法来及时关闭一个Session(Session.aban-don)O
(2)缓存ASP页O在编码中最好不要使用Re-sponse.buffer缓存ASP页技术,因为当一个Web页面输出至缓冲区时,服务器端无法再响应客户端,直到所有的服务器端文件都被处理完毕O这样直到全部页都提交后才输出页面至客户端,尤其对于大的~TML页会让浏览者长时间等待,或者调用Re-sponse对象的Flush~End方法,来及时输出页面至客户端O可选择的方法是利用动态缓存技术,它是根-68-
架的页面效果O
(4)在网页里尽量不要使用太大的表格O如果网页里放一个大的表格,在这张大的表格里又放有小的表格和图片~文字,这样就和前面所说的缓存ASP页一样,直到全部页都下载后才显示页面,因浏览器要得到表格的所有内容后才显示这张表格O解决的方法是把大的表格分成许多小的表格O
(5)及时关闭已打开提交过的记录集以及连接(Connection)对象O记录集对象和连接对象耗费系统资源相当大,因此它们的可用量是有限的O如果打开太多的记录集对象以及连接对象而最后却没有关闭它们,会出现ASP程序刚开始时运行速度很快,而多运行几遍就越来越慢的现象,甚至导致服务器死机O可使用下面的方法进行关闭,
Recordset.closeSetRecordset=NothingSetconnection=Nothing
(6)在操作大量数据时,使用SGL指令比Recordset对象快,数据量越大越明显O主要原因在于SGL指令是一次下给数据库的,让数据库整批处理数据,而对象则是逐条操作数据记录,所以速度慢O两者的使用方法如下,
使用SGL指令,数据库整批处理数据
conn.executeUpdate股票行情表Set成交量=成交量-1\"使用对象,逐条操作数据记录WhileNotrs.Eof
Rs(成交量)=rs(成交量)-1Rs.UpdateRs.MoveNextWend
但是使用SGL指令不容许再取消对所有数据记录的操作,因一旦下达SGL指令,操作的结果就会写到数据库中;而Recordset对象可调用Can-
celUpdate方法来取消对当前数据记录的操作,此外,运用BeginTrans~CommitTrans~RollBackTrans的技巧,可以取消对所有数据记录的操作,并且能够整批操作数据,从而大大提高程序的执行效率,具体实现,
conn.BeginTrans 建立Recordset对象
利用Recordset对象操作数据conn.CommitTrans
数据不会立即写到数据库
rs.Open数据表,conn,adOpenDynamic,adLockOptimisticrs.(收盘价)=rs.(收盘价)+O.3rs.Update
不锁定数据记录
吕志虎,王蜀毅,Web交互式动态页面的优化
锁定数据记录,更新数据库,然后解除锁定
这种锁定模式只有在Update方法被调用时锁定数据记录,而在这个数据记录写入数据库之后,即解除锁定,故该锁定模式不安全,
D.批次乐观锁定,批次乐观锁定在更新数据记录的过程中,暂时不锁定欲更新的数据记录,不将更新的数据记录写入数据库,直到调用UpdateBatch此时才将所有数据写入数据库
如果要取消对所有数据的操作,则调用Roll-BackTrans方法,
conn.BeginTrans 建立Recordset对象
利用Recordset对象操作数据数据不会立即写到数据库
conn.RollBcakTrans
取消对所有数据的操作
使用该方法时,建立Recordset对象的语句不可以放在BeginTrans方法之前,否则会产生错误,
(7)数据记录的锁定,数据记录的锁定可分为应用程序锁定(Application.Lock)~悲观锁定~乐观锁定~批次乐观锁定4个层次,
A.应用程序锁定模式,
Application.Lock建立Recordset对象
更新数据的Recordset方法或更新数据的SOL指令Application.UnLock
如果每一个更新数据的程序都是这样,其它想要更新数据的程序就必须等这个程序完成数据更新后,才可以更新数据,采用该锁定模式是比较安全的,对于上网人次不高的网页采用此锁定模式比较合适,但是该锁定模式的执行效率比较低,
B.悲观锁定是将Recordset对象的锁定类型设为adLockPessimistic,
rs.Open数据表,conn,adOpenDynamic,adLockPessimisticrs.(收盘价)=rs.(收盘价)+O.3进入数据记录的锁
定模式
rs.Update
更新数据后,即解除锁定
若在执行该语句时,当前数据记录位于 股票代码= OOO1',则在这个程序调用Update之前,其它程序不能够更新 股票代码= OOO1'的数据记录,但可以更新其它数据记录,
C.乐观锁定是将Recordset对象的锁定类型设为adLockOptimistic,
方法时才将整批更新的数据写入到数据库,而且只有在这个时候才锁定欲更新的所有数据记录,
rs.Open数据表,conn,adOpenDynamic,adLockBatchOptimi-stic
WhileNotrs.Eof
rs(成交量)=rs(成交量)+1不锁定数据记录
rs.MoveNextWend
rs.UpdateBatch
此时锁定欲更新的所有数据记录
将Recordset对象设置成批次乐观锁定模式后,更新与取消更新的方法是UpdateBatch和Can-celBatch,而不是Update及CancelUpdate,
基本上锁定模式与执行效率成反比,越乐观的锁定模式执行效率越高,但相对出现数据更新错误的概率也越高,对上网人次不高的网页,采用应用程序锁定模式比较合适,如果提供给上网者使用的网页只可以浏览~删除或添加数据记录(不包括更新数据记录),则使用乐观锁定或批次乐观锁定比较好,
3
数据库访问控制优化技术
目前,几乎所有的大型网站都有关系数据库支
持,实现Web服务器与关系数据库系统的互访问,完成对关系数据库中数据的处理与查询,以使用户通过浏览器支持的Web页面来访问存贮在关系数据库中的数据,在后台数据库的选择上最好使用并发性能较强的关系数据库系统,在NT平台上可考虑MS-SOLServer来支持一个规模不大的网站,一般情况下,数据访问时间要比ASP代码解释~编译时间长,提高数据访问速度包含2方面的内容,与数据库建立连接~检索数据,建立高效的连接是优化数据访问的第一步,
69
2001年第2期
重庆邮电学院学报
使用0LEDB
ADO连接数据库通常有3种方法,SystemDSNConection,DSN lessConnection和OLEDB3.1
Connection,3种方法的区别在于使用的是哪个关键字,DSN,Driver,DataSource,Provider,UID,PWD是ODBC的标记,UserID,PassWord是OLEDB的标记,DataSource在ODBC标记中表示数据源,等同于DSN,在OLEDB标记中表示服务器名或数据库名,它们的具体使用方法如下,
CUPT
入~更新和删除站点服务器的数据库信息,ADO几乎可在任何支持ComponentObjectModel(COM)以及OLE的服务器端操作系统上使用,ADO对OLEDB数据访问规范进行了封装,使用者通过OLEDB接口存取各种异构数据,加强了对Web应用的支持,它支持创建独立的数据访问对象,通过局部缓存数据,再以批处理方式更新数据,并支持结果集返回有限的行及其它返回值的处理,
ADO共享机制是不同的Command对象或 SystemDSNConnection
Setcnn=Server.CreateObject(ADODB.Connection)cnn.OpenDSN=your-dsn;UID=user-name;PWD=pass-Word DSN lessConnection 以SGLServer为例
Setcnn=Server.CreateObject(ADODB.Connection)cnn.Opendriver={SGLServer};server=server-name;uid=user-name;pWd=pWd;database=pubs OLEDBConnection 以SGLServer为例
Setcnn=Server.CreateObject(ADODB.Connection)cnn.OpenProvider=SGLOLEDB;DataSource=Server-name;InitialCatalog=pubs;UserID=user-name;passWord=pWd从本质上说,SystemDSN和DSN lessCon-nection都是通过ODBC与数据库进行连接的,二者的区别不大,但在访问量大的时候,DSN lessCon-nection稍优于SystemDSN,因SystemDSN在连接时要读注册表,而OLEDB要比ODBC效率高,经ODBC连接是ADO OLEDB ODBCProvider ODBC driver 数据库,经OLEDB是ADO OLEDB DBProvider 数据库,显然是OLEDB连接更直接,OLEDB连接数据库检索数据都比ODBC快,
3.2
充分利用AD0对象及其共享机制
ADO是一种可提供Web页面开发者存取In-ternet上的数据库,并可在用户端实现网上立即~即时更新显示的最新Web页面数据库技术,相对OLEDB属于系统级编程接口,ADO则属于程序级编程接口,为ASP提供完整的站点数据库访问解决方案,ADO与ASP接合,作用在服务器端,通过OLEDB提供存取~操纵各种关系型及非关系型数据库,通过执行SGL指令,让用户在浏览画面中输-70-
Recordset对象可共享同一个Connection对象,甚至不同Web页面对数据库的连接可共享同一个Connection对象,即仅需一个Connection对象对数据库作出连接动作,就可重复不断地利用它来向数据库服务器作出不同的数据查询动作,以及不同的Web页面对于每次数据库的连接不需要分别建立而是共享同一个Connection对象,从而降低了数据库服务器的负担,大大提高了整个应用程序的响应速度和效率,此共享机制与ODBC内的ConnectionPool(连接池)结合,改善了服务器的连接效率,为多个Recordset创建一个Connection对象的实现,
Strcnn=Provider=SGLOLEDB;DataSource=server-name;InitialCatalog=Dbname;UserID=user-name;PassWord=pWdSetcnn=Server.CreateObject(ADODB.Connection)cnn.OpenStrcnn
Setrs1=Server.CreateObject(ADODB.Recordset)rs1.OpenSELECTeFROMAuthors1\",cnnSetrs2=Server.CreateObject(ADODB.Recordset)rs2.OpenSELECTeFROMAuthors2\",cnnSetrs3=Server.CreateObject(ADODB.Recordset)rs3.OpenSELECTeFROMAuthors3\",cnn--
3.3
创建Connection对象,充分利用连接池
在优化ASP程序代码中曾提到及时关闭连接
(Connection)对象,因为保留连接对象,或者说不及时释放连接对象会占去服务主机的内存,如有多个连接对象同时存在,将会大大降低服务器的整体性能,连接池能充分解决这个问题,它是服务器共享的资源,不属于某个ASP,也不属于Session,或者某个Application,其关键是连接池可帮助客户端重复利用并恢复以前已经打开的数据库通道;对于ASP,数据库程序代码的编写方法没有改变,改变的是
0DBC对客户端连接的处理方式,现在的一般大型数据库包括0DBC本身都提供连接池功能,其基本原理(见图2),对客户端已解除连接的Connection通道,系统并不是真的关闭它,而是将它放在连接池中,连接池会把该Connection通道维持在浮动状态一段时间,如果这时任何其他客户端欲与服务器端数据库建立相同的连接请求,系统就会导引连接至浮动通道,并重复利用通道,恢复实际的数据库连接,这样就省去了关闭和打开连接的系统开销,只有吕志虎,王蜀毅,Web交互式动态页面的优化
因是充分利用了连接池的功能,
直接打开Recordset要比创建Connection快,快在页面的处理上,二者检索数据库的速度是一样的,但直接打开Recordset依然要创建与数据库的连接,只不过是由AD0自动完成的;且AD0自动创建的这个连接只有在该页面处理完后才能被释放,Recordset.Close或Setrecordset=Nothing都不能做到释放该对象,由于服务器处理ASP时不是一次只处理一个,也不是一次把整个页面处理完,没当这个浮动通道长时间不被请求时,连接池中的连接饱和,系统才会真的关闭该连接,
连接?-ConnectionPool浮动连接通道连接?
--浮动连接通道-资料库连接-恢复连接-浮动连接通道图2ConnectionPool原理示意图
打开Recordset对象的两种方法,
直接打开Recordset
strcnn=Provider=SGL0LEDB;DataSource=server-name;InitialCatalog=Dbname;UserID=user-name;Password=pwdForI=1to20
Setrs=Server.Create0bject(AD0DB.Recordset)rs.0penSELECT%fromauthors,strcnnrs.CloseSetrs=NothingNext
由于直接打开Recordset没有利用连接池,每次与数据库的连接都要重新创建,故上面的代码在执行时与数据库的连接要创建20次,
利用Connection对象,打开Recordset
strcnn=Provider=SGL0LEDB;DataSource=server-name;InitialCatalog=Dbname;UserID=user-name;Password=pwdForI=1to20
Setcnn=Server.Create0bject(AD0DB.Connection)cnn.0penstrcnn
Setrs=Server.Create0bject(AD0DB.Recordset)rs.0penSELECT%fromauthors,cnnrs.CloseSetrs=Nothingcnn.CloseSetcnn=NothingNext
执行这个代码段,与数据库的连接只被创建2个,原
有关闭的连接只会占用更多的系统资源,所以要尽快释放Connection,使它回到连接池,
4
结束语
本文所讨论的优化方法在NTServer环境下通过测试,已应用于重庆市应用基础研究项目 Web通用动态查询页面自动生成平台,在具体实现上还要综合其它方法,目前将进行如下工作,动态创建和撤销数据库操作线程,因数据库操作线程是在服务端启动时创建的,其数目不能动态改变,随着连接数的增加,这些线程可能不能及时满足客户的请求,从而会成为系统的瓶颈,导致系统响应延迟,我们将为系统增加动态创建/撤销数据库操作线程的功能,当连接数超过阈值时,系统将创建出新的操作线程数据库操作支持,反之,就撤销某些线程,释放占有的资源,这样既保证了响应速度,又提高了资源利用率,ASP要依赖Windows(NT和95)平台,在开发应用中,也可以选择具有跨平台的InstantASP技术(Halcyon公司开发的)或JSP技术(JavaServerPages,以SunMicrosystems公司为主开发的),
参
考
文
献
[1]AD0技术文档[EB/0L].http,//www.mi-crosoft.com/data/ado/
[2]ASP技术文档[EB/0L].http,//www.mi-crosoft.com/workshop/sever/asp/
[3]ASP动网先锋[EB/0L].http,//asky.on.net.cn/
[4]
王国荣.ActiveServerPagesgWEB数据库[M].北京,人民邮电出版社,1999.
71
因篇幅问题不能全部显示,请点此查看更多更全内容