当前位置: 首页 > 图文教程 > 网络编程 > ASP > ASP 3.0高级编程(四十三)

ASP
asp生成三维饼图的函数
ASP下的简洁的多重查询的方法与函数 真不错
发一个ASP的ADODB类代码
A利用ASP小偷和Google实现在线翻译功能的代码
ASP类型网站结合动网论坛会员的方法
Asp下实现多表单域无组件文件上传的实例
asp制作中常用到的函数库集合
易心asp分页类 v1.0
asp中xmlhttp组件发包
检测是否为数字类型的asp代码
可以获得文件的文件名的asp函数
用asp实现访问远程计算机上MDB access数据库文件的方法
用ASP实现写IIS日志的代码
asp在IE浏览器中下载服务端上的各类文件的实现方法
asp汉字中文图片验证码的实现代码
asp WAP获取手机终端信息的一段代码
asp取得数组中的最大值的方法
用asp实现的截取指定格式字符串的代码
asp jmail发邮件 详细解析
ASP编程中连接数据库和数据库操作的常用代码

ASP 3.0高级编程(四十三)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 222 ::
收藏到网摘: n/a

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管理方面占用服务器的资源,因此不要缓存大的记录集。