我正在运行一个经典的vbscript ASP站点和SQL2008数据库。有几页处理器很重,但实际上并没有经常改变。理想情况下,我希望服务器每晚处理一次这些数据(可能放入HTML页面),然后再从服务器上飞走,而不必为每个用户处理。前处理(经典)ASP页面
任何想法,我可以做到这一点?
该应用程序本身工作得很好,所以我不想用另一种脚本语言重写整个事情,即使经典的asp有点过山!
我正在运行一个经典的vbscript ASP站点和SQL2008数据库。有几页处理器很重,但实际上并没有经常改变。理想情况下,我希望服务器每晚处理一次这些数据(可能放入HTML页面),然后再从服务器上飞走,而不必为每个用户处理。前处理(经典)ASP页面
任何想法,我可以做到这一点?
该应用程序本身工作得很好,所以我不想用另一种脚本语言重写整个事情,即使经典的asp有点过山!
是:
你没有指定页面的部分是“处理器重”,但我会假设它是SQL数据的查询和处理。一个想法是检索数据并将其作为缓存文件存储在文件系统中。 XML是数据格式的不错选择。
而你原来的代码是这样的:
(psuedocode)
get results from database
process results to generate html file
...修改后的代码可以是这样的:
check if cache file exists
if not exist
get results from database
store results in cache file
get results from cache file
process results to generate html file.
这是一般的高速缓存方法,可以应用到你有 查询参数确定输出的情况。根据所有组成参数简单地生成缓存文件的名称。因此,如果结果取决于名为p1和p2的查询参数,那么当p1
和p2
分别具有值1234
和blue
时,缓存文件可能被命名为cache-1234-blue.xml
。如果您有5个不同的查询,则可以将它们缓存为query1-1234-blue.xml
,query2-1234-blue.xml
等。
你不需要这样做“每晚”。您可以在代码中包含缓存生命周期,并且在“如果缓存文件存在”测试中使用“如果缓存文件存在并且是新鲜的”。要做到这一点,只需获取缓存文件上的最后修改时间戳,并查看它是否比缓存生存期更早。
Function FileOlderThan(fname, age)
'function returns True if the file is older than the age,
' specified in minutes.
Dim LastModified, FSO, DateDifference
Set FSO = CreateObject("Scripting.FileSystemObject")
LastModified = FSO.GetFile(fname).DateLastModified
DateDifference = DateDiff("n", LastModified, Now())
If DateDifference > age Then
FileAge = False
Else
FileAge = True
End If
End Function
fname = Server.MapPath(".") & cacheFileName
If FileOlderThan(fname, 10) Then
... retrieve fresh data ...
End If
这可能是10分钟,10小时,10个请求,无论你喜欢什么。
我上面说过,对于缓存文件中的数据格式来说,XML是一个不错的选择。 ADO具有SaveAsXML方法,您还可以使用附加到查询的FOR XML
子句直接从SQL2008生成XML。
如果“处理器重”的部分不是查询和检索,但在html页面的生成,那么你可以申请相同的排序方式,而只是直接缓存HTML文件。
非常感谢这个Cheeso!在解决这个问题的时候,我有一些页面的查询量很大,以及一些HTML代码更多,所以你的优秀答案涵盖了两个方面。 –
这听起来有点像一些我从其他网站获取数据的页面。我对它们进行了修改,以便在表格中保存数据的缓存副本以及指示何时获取数据的日期/时间。缓存满足大部分请求,但是如果数据已经过时,则更新缓存。您可以使用SQL Server中的计划作业来更新缓存的数据。如果问题全部在ASP VBscript方面,请查看<您最喜爱的搜索引擎>:缓存经典ASP页面 – HABO