ASP 3.0高级编程(四十三)

编程|高级

9.3.5 数据高速缓存
首先需要注意的是,数据高速缓存与记录集高速缓存虽然都用于改善性能,但两者是无关的。数据高速缓存是临时的数据存储区,允许使用高速缓存中的数据,而不是重新生成新的数据。这只适用于那些不经常改动但多次被访问的数据。
在ASP中一个最简单的缓存数据的方法是使用Application和Session范围的变量。例如,假设有一些需要选择书类型的网页。正常情况下,可能会创建一个含有以下函数的包含文件。
<%
Function BookTypes()

Dim rsBookTypes
Dim strQuote

strQuote = Chr(34)

Set rsBookTypes = Server.CreateObject ("ADODB.Recordset")

' Get the book types
rsBookTypes.Open "usp_BookTypes", strConn

Response.Write "<SELECT NAME=" & strQuote & lstBookType & strQuote & ">"
While Not rsBookTypes.EOF
Response.Write & "<OPTION>" & rsBookTypes("Type") & "</OPTION>"
rsBookTypes.MoveNext
Wend
Response.Write & "</SELECT>"

rsBookTypes.Close
Set rsBookTypes = Nothing

End Function
%>
这仅仅是调用一个存储过程,从而得到书的类型,同时创建一个SELECT列表。上述代码的缺点在于每次调用该函数都必须访问数据库。因此,重新修改这个函数。
<%
Function BookTypes()

Dim rsBookTypes
Dim strQuote
Dim strList

' See if the list is in the cache
strList = Application("BookTypes")
If strList = "" Then
' Not cached, so build up list and cache it
strQuote = Chr(34)

Set rsBookTypes = Server.CreateObject ("ADODB.Recordset")

' Get the book types
rsBookTypes.Open "usp_BookTypes", strConn

strList = "<SELECT NAME=" & strQuote & lstBookType & strQuote & ">"
While Not rsBookTypes.EOF
strList = strList & "<OPTION>" & rsBookTypes("type") & "</OPTION>"
rsBookTypes.MoveNext
Wend
strList = strList & "</SELECT>"

rsBookTypes.Close
Set rsBookTypes = Nothing

' Check the list
Application("BookTypes") = strList
End If

BookTypes = strList

End Function
%>
这段代码不只是打开记录集,它检查Application变量BookType的值是否为空。如果不为空,则使用该变量的内容。如果为空,则像以前一样打开记录集。显然,一旦第一个人运行了这一例程,便缓存了数据,因此这只对那些不常变化的数据是有用的。
如果想在用户基础上缓存数据,可以使用Session范围的变量,但这里必须注意Session存在有效期。过期后会话层变量将和会话一起取消,代码便有可能终止运行。
利用Web Application Stress(WAS)工具,得到了表9-4的分析结果:
表9-4 利用WAS工具得到的分析结果
方 法
页面点击次数

没有高速缓存
190

有高速缓存
11000

很明显性能有所改善。但不要采用上述方法缓存一切内容。毕竟,这种方法只适用于那些已经格式化后用于显示的数据。除此之外,还要考虑到如果Web服务器只为特定的一个人服务,那几乎不是一个典型的Web服务器的用法。使用WAS可以在一个服务器上模拟多个用户,这样可以更实际地测试应用程序。
通过模拟一定数量的用户,Web Application Stress工具可以对Web页面进行承受力测试。该工具有一个简单的图形界面,使用起来非常容易。可以从http://homer.rte.microsoft.com/获得更多的信息,也可以下载该工具。
高速缓存对象
若要缓存未格式化过的数据该怎么办?可以在不同地方以不同的方式使用吗?当然,也可以用Application或Session变量这样做。考虑一下书标题的情况。你或许希望在多个页面中使用这个标题,也许在一个表格中显示所有的标题,或在一个列表框中显示供用户选择等等。你可能会想到可以缓存记录集本身而无需缓存含有标签的HTML文本。
可以在Application或Session变量中缓存对象,但有两个主要的问题需要注意:
· 存放在Application变量中的对象必须支持自由线程,因此必须是自由线程对象或双线程对象。这意味着无法在Application变量中缓存由VB创建的组件。
· 在Session状态中存放单元线程对象意味着创建该对象的线程是唯一允许访问它的线程。因此IIS无法较好地完成线程管理,因为任何试图访问这个对象的页面都必须等待原有线程服务于该页面。这将扼杀扩展应用程序的任何机会。
对于线程问题的讨论参见第15章。
默认情况下,ADO作为单元线程对象装载,这主要是因为部分OLE DB提供者并非是线程安全的。在ADO安装目录中有一个注册表文件,可将ADO转换成双线程模型,由此使ADO对象可以安全地存放在Application和Session对象中。
你也许会认为所有的问题都解决了,可以通过使用各种类型的对象获得显著的速度提升,但这并不一定。许多人已经认识到既然连接到数据库是一个相对昂贵的操作,那么缓存Connection对象可在再次连接时节省大量的时间。的确如此,但缓存Connection对象意味着该连接永远不会关闭,因此连接缓存池的工作效率比较低。连接缓存池隐含的一个思想实际上是减少服务器上使用的资源,而缓存ASP状态中的对象显然不能减少资源的使用。事实上还增加了对它们的占用,因为每缓存一个对象便要占用服务器的资源,对于一个繁忙的站点而言,这将极大地降低Web服务器的效率。
所以不应存储Connection对象,但对于Recordset对象,特别是断开连接的记录集呢?假定ADO已从单元线程变成了双线程,就没有什么理由不这么做了,只要确切知道自己在做什么。不要认为这会自动地改善ASP页的性能。每一个缓存的记录集都在内存和ASP管理方面占用服务器的资源,因此不要缓存大的记录集。
另一个技巧是使用记录集的GetRows方法,将记录集转换成一个数组。因为
[1] [2] [3] 下一页  

时间: 2024-11-17 19:11:06

ASP 3.0高级编程(四十三)的相关文章

ASP 3.0高级编程(十三)

编程|高级 1.3 ASP Server对象正像在前面看到的那样,通过服务器端包含的经ISAPI访问Web服务器的页面,用传统动态页面指令和命令可以做相当多的事情.但同时也有一些明显的限制.例如,可以从Request.ServerVariables集合检索到所有随同客户端的请求发送过来的HTTP报头的值.它几乎可以与使用SSI #echo匹敌,同时具备的主要优点是把这些值作为字符串返回到代码中(而#echo指令简单地把这些值插入到页面中),因此可以根据自己的愿望来检索和维护这些字符串.许多相同的

ASP 3.0高级编程(三十三)

编程|高级 7.4.2 VBScript错误处理在VBScript中,可以使脚本解释器不处理其找到的任何错误,并且使用On Error Resume Next语句继续运行下个语句.一旦这个语句已被处理,脚本引擎将继续运行后面的程序,而不理会已经发现的任何错误.然而,这种过程仅适用于顺序执行语句的环境,换句话说,不适用于嵌套的函数或子程序.1. 使用On Error Resume Next语句一个错误在子程序中出现时,如果没有运行On Error Resume Next语句,那么错误将被交给调用它

ASP 3.0高级编程(四十)

编程|高级 8.5.1 Errors集合Errors集合包含由单个ADO命令的执行而引起的每一个错误的Error对象.使用Errors集合的原因是由于在一个命令的执行过程中,可能会引起多个错误,OLE DB提供者需要提供一种方式通知客户方已有多个错误发生.关于Errors集合有两个重要的地方需要注意:· 每次执行ADO命令,如果发生错误,就清空错误集,同时代之以新的错误内容.当然,如果没有错误发生,Errors集合不会受到影响.所以,即使ADO命令成功执行,这个集合中也可能含有错误信息.· OL

ASP 3.0高级编程(十四)

编程|高级 4.3.3 执行其他的网页ASP 3.0和IIS 5.0的新特性之一就是引入了可编程的服务器端重定向(server-side redirection)的概念.这意味着,可以把一个网页的控制和执行转到另外一个网页,而不需要在客户端使用Response.Rdedirect方法.1. 客户端重定向带来的问题ASP编程人员通常使用Response.Redirect语句把一个页面载入到当前正在执行的网页.然而,许多人没有意识到这条语句不会自动地使服务器立即装入和执行新的网页.其真正做的是把一个

ASP 3.0高级编程(二十三)

编程|高级 第6章 活动服务器组件在前几章中,我们已经研究了两类不同的对象:一类是ASP对象模型的内置部分,另一类是脚本运行期库提供的对象.本章将介绍第三类能用于ASP的对象,取名为活动服务器组件(或者就称为服务器组件).这些组件在很多场合下就如同在浏览器或在像Visual Basic编程环境中用于客户端脚本中的传统ActiveX控件一样,但是这些组件可在服务器上运行,而不是一个只能运行在客户机上的对象.现在的问题是:这些组件来自哪里?其中一部分是由常规的ASP/IIS安装程序提供的,而另一部分

ASP 3.0高级编程(十七)

编程|高级 第5章 脚本运行期库对象前面章节已经介绍了ASP如何使用在服务器上定义的对象的实例,充分利用所提供的方法和属性扩展ASP的性能.有一系列的对象可供使用,包括脚本对象和标准IIS/ASP安装的组件,以及自己创建的或者从其他供应商处购买的对象.也可以在互联网上各种网站免费下载对象,并在自己的页面上使用.这一章将讨论由ASP脚本环境提供的一般称为"脚本运行期库"(Scripting Runtime Library)的对象.这些对象通过正在使用的脚本引擎提供给代码,与ASP脚本程序

ASP 3.0高级编程(二十九)

编程|高级 6.3.2 SA-FileUP组件在很多Web网站上,一个常规要求是,服务器接受客户机发送的文件的能力如何?在IIS 4.0里,Microsoft提供了一个名为Posting Acceptor组件完成这项工作,IIS 5.0和ASP 3.0的标准安装中没有该组件,如果安装Site Server Express的话,则需要包含这一组件.可以从Microsoft Web网站http://www.microsoft.com/windows/software/webpost/post_acc

ASP 3.0高级编程(三十二)

编程|高级 7.2.4 客户端脚本错误到目前为止,我们已了解了来自ASP的错误.然而ASP也经常用于创建包含客户端脚本的网页.如果包含客户端代码的<SCRIPT>元素没有被设置成RUNAT="SERVER"属性,ASP将不考虑服务器,而把网页信息不加改变地传送到客户端.因此,如果打开了一个ASP网页,并且显示的是一个浏览器错误对话框,就不应该在服务器端寻找ASP程序代码的错误.浏览器看不到ASP程序代码,所以不能识别任何错误,如果有一个对话框出现在客户端,那么在客户端代码中

ASP 3.0高级编程(五)

编程|高级 1. 操作HTTP报头我们已经在几处见到ASP如何创建或修改在响应页面请示时被发送到客户的HTTP报头.在Response对象中有几个属性和方法可帮助我们做到一点.下面是一些报头方法:· 控制缓存和有效期.· 创建状态和定制的HTTP报头.· 指定MIME类型或内容类型.· 添加PICS标签.接下来将简要地研究每一个方面.可在"Response Object"主页(show_response.asp)上,单击相关属性名或方法名,来检查我们所说的属性和方法,如下图所示: 1.

ASP 3.0高级编程(十五)

编程|高级 4.3.4 Server对象的错误处理ASP没有错误处理机制一直受到批评.在VBScript中,有一个On Error Resume Next语句,它使脚本解释器忽略运行期错误并继续脚本代码的执行.接着该脚本可以检查Err.Number属性的值,判别是否出现了错误.如果出现错误,返回一个非零值.在ASP 3.0中,也可以使用On Error Goto 0"转回到"缺省的错误处理.在ASP 2.0中实际也进行这种处理,但是没有相应文档说明.在Jscript中,有一个新的错误处