唐山网站建设

设为主页 加入收藏 繁體中文

ASP 3.0高级编程(4103)

核心提示:首先需要留意的是,数据高速缓存与记录集高速缓存固然都用于改良性能,但二者是无关的。数据高速缓存是临时的数据存储区,答应使用高速缓存中的数据,而不是重新天生新的数据。这只适用于那些不常常改动但屡次被访问的数据。

9.3.5 数据高速缓存
首先需要留意的是,数据高速缓存与记录集高速缓存固然都用于改良性能,但二者是无关的。数据高速缓存是临时的数据存储区,答应使用高速缓存中的数据,而不是重新天生新的数据。这只适用于那些不常常改动但屡次被访问的数据。
在ASP中1个最简单的缓存数据的方法是使用Application和Session范围的变量。例如,假定有1些需要选择书类型的网页。正常情况下,可能会创建1个含有以下函数的包括文件。
<%
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 ""

rsBookTypes.Close
Set rsBookTypes = Nothing

End Function
%>
这仅仅是调用1个存储进程,从而得到书的类型,同时创建1个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 = ""

rsBookTypes.Close
Set rsBookTypes = Nothing

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

BookTypes = strList

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

没有高速缓存
190

有高速缓存
11000

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


TAG:数据,对象,缓存,线程,变量
评论加载中...
内容:
评论者: 验证码: