欢迎光临!今天是2017年10月18日 星期三
首页 基础教程  留言薄制作  神奇FSO  ASP优化  ASP实例  SQL语法  VB教程  安全手册  综合技巧  案头必备  留言  
 ASP优化
·如何增强ASP程序性能_简介
·技巧1:在Web服务器上缓存..
·技巧2:在Applicati..
·技巧3:在Web服务器磁盘上..
·技巧4:避免在Applica..
·技巧5:不要在Applica..
·技巧6:聪明地使用Sessi..
·技巧7:将代码装入COM对象中
·技巧8:使用Option E..
·技巧9:拷贝经常使用的数据到..
·技巧10:避免再定义数组
·技巧11:使用Respons..
·技巧12:批处理单行脚本和R..
·技巧13:使用< OB..
·技巧14:避免在循环中串联字..
·技巧15:打开浏览器和代理的..
·技巧16:在任何可能时使用S..
·技巧17:避免使用服务器变量
·技巧18:调整Web服务器
·二十八条改善ASP性能和外观..
·28-1将经常使用的数据缓存..
·28-2将经常使用的数据缓存..
·28-3将数据和 HTML ..
·28-4避免将非敏捷的组件缓..
·28-5不要将数据库连接缓存..
·28-6合理地使用 Sess..
·28-7将代码封装在 COM..
·28-8迟一点获得资源,早一..
·28-9进程外执行过程以性能..
·ASP 选项
·28-10:使用显式选项
·28-11在子例程和函数中使..
·28-12将经常使用的数据复..
·28-13:避免重新确定数组..
·28-14:使用响应缓冲
·28-15:批处理内嵌脚本和..
·28-16:如果页面需要很长..
·28-17:使用 < ..
·28-18:对于ADO和其它..
·28-19:利用浏览器的验证..
·28-20避免在循环语句中使..
·28-21:启用浏览器和代理..
·28-22:尽可能使用Ser..
·28-23:在目录 URL ..
·28-24:避免使用服务器变..
·28-25:升级到最新和最出..
·28-26:优化 Web 服..
·28-27:进行性能测试
·28-28:阅读资源链接
■ ASP优化 > 技巧2:在Application或Session对象中缓存经常使用的数据
  ASP中的Application和Session对象是在内存中缓存数据的便利容器。你可以将数据赋值给Application和Session对象,这些数据在HTTP调用期间将一直保持在内存中。Session中的数据是为每一个用户服务的,Application中的数据是所有用户共享的。

  何时需要在Application和Session中装入数据?通常,当应用程序启动或者会话开始时,数据就被装入了。为了在这时装入数据,在Application OnStart()或者Session OnStart()中分别添加适当的代码。这些函数位于文件Global.asa中,如果原来不存在,就添加上。也可以在数据首次需要的时候调入,在ASP页面中添加代码,检查数据是否存在,如果没有发现,就调入它。这里有一个例子,它代表了被称为“lazy evalution”的经典性能处理技术:直到需要时,再去计算。例子如下:

<%
Function GetEmploymentStatusList
Dim d
d = Application("EmploymentStatusList")
If d = "" Then
' FetchEmploymentStatusList function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()
Application("EmploymentStatusList") = d
End If
GetEmploymentStatusList = d
End Function
%>

对于不同的数据,可以编写类似的函数代码。

  数据应该按什么格式保存?任何变量类型都可以,因为所有的脚本变量都是不同的。比如说,可以保存为字符串、整型或者数据。通常,将ADO记录集的内容存储到这些变量类型中一个。为了从ADO记录集中取出数据,需要手工地拷贝数据到VBScript变量中,每次一个字段。使用任意一个ADO记录集的函数functions GetRows(),GetString() 或者 Save() (ADO 2.5)都非常得快速而且简单,这里有个函数,描述了如何使用GetRows()返回记录集数据的数组:


' Get Recordset, return as an Array
Function FetchEmploymentStatusList
Dim rs
Set rs = CreateObject("ADODB.Recordset")
rs.Open "select StatusName, StatusID from EmployeeStatus", _
"dsn=employees;uid=sa;pwd=;"
FetchEmploymentStatusList = rs.GetRows() " Return data as an Array
rs.Close
Set rs = Nothing
End Function

上述代码的一个更深的技巧是为列表缓存了HTML。下面是个简单的例子:


' Get Recordset, return as HTML Option list
Function FetchEmploymentStatusList
Dim rs, fldName, s
Set rs = CreateObject("ADODB.Recordset")
rs.Open "select StatusName, StatusID from EmployeeStatus", _
"dsn=employees;uid=sa;pwd=;"
s = "<select name=""EmploymentStatus">" & vbCrLf
Set fldName = rs.Fields("StatusName") ' ADO Field Binding
Do Until rs.EOF
' Next line violates Don't Do String Concats,
' but it's OK because we are building a cache
s = s & " <option>" & fldName & "</option>" & vbCrLf
rs.MoveNext
Loop
s = s & "</select>" & vbCrLf
rs.Close
Set rs = Nothing ' See Release Early
FetchEmploymentStatusList = s ' Return data as a String
End Function

在合适的环境下,可以在Application或者Session中缓存ADO记录集本身,但是有2点提示:


ADO必须是自由线程标记的
需要使用disconnected recordset方式
  如果不能保证上述2个条件,就不要缓存ADO记录集,因为这会产生很大的危险性。

  当在Application或Session中保存数据后,数据将一直保持,除非程序改变它、Session变量到期或者Web应用程序重新启动。如果数据需要更新,怎么办?可以调用只有管理员才能访问的ASP页面来更新数据,或者,通过函数周期性的自动更新数据。下面的例子中,与缓存数据一起保存了时钟标记,过一段时间后,就刷新数据。


<%
' error handing not shown...
Const UPDATE_INTERVAL = 300 ' Refresh interval, in seconds

' Function to return the employment status list
Function GetEmploymentStatusList
UpdateEmploymentStatus
GetEmploymentStatusList = Application("EmploymentStatusList")
End Function

' Periodically update the cached data
Sub UpdateEmploymentStatusList
Dim d, strLastUpdate
strLastUpdate = Application("LastUpdate")
If (strLastUpdate = "") Or _
(UPDATE_INTERVAL < DateDiff("s", strLastUpdate, Now)) Then

' Note: two or more calls might get in here. This is okay and will simply
' result in a few unnecessary fetches (there is a workaround for this)

' FetchEmploymentStatusList function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()

' Update the Application object. Use Application.Lock()
' to ensure consistent data
Application.Lock
Application("EmploymentStatusList") = d
Application("LastUpdate") = CStr(Now)
Application.Unlock
End If
End Sub

有另外一个例子,请参阅 World’s Fastest ListBox with Application Data。

  必须意识到,在Session或者Application对象中缓存大容量的数组不是一个好的方法。存取数组中任何元素前,脚本语言的规则要求首先要建立整个数组的临时备份。比如,如果在Application对象中缓存一个100,000个元素的数组,其中包含U.S.邮政编码与本地气象站的对应关系,ASP就必须首先拷贝所有100,000个气象站信息到临时数组中,然后才能选择其中一个字符串进行处理。在这种情况下,创建一个定制的组件,编写一个方法存储气象站信息,是非常好的方法。

■今日推荐:技巧17:避免使用服务器变量

本网站是学习网站,内容整理大多来自互联网,尽量标明了出处,如果侵犯了您的权力请通知我,立即纠正
欢迎提出宝贵建议,提供相关资料,以便相互学习,共同提高!