我正在运行带有SQL2008数据库的经典vbscript ASP站点。有几页处理器很重,但实际上并没有经常改变。理想情况下,我希望服务器每晚处理一次,也许是HTML页面,然后可以飞离服务器,而不是必须为每个用户处理。
我是如何实现这一目标的?
应用程序本身运行良好,所以我不想用另一种脚本语言重写整个东西,即使经典的asp有点过山!!
答案 0 :(得分:1)
是的:
您没有指定页面的哪些部分是“处理器繁重”,但我会假设它是查询和处理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
时,缓存文件可能会被命名为{{ 1}}。如果您有5个不同的查询,则可以将其缓存为cache-1234-blue.xml
,query1-1234-blue.xml
等。
你不需要“每晚”这样做。您可以在代码中包含缓存生命周期,并且代替“if cache file exists”测试,使用“如果缓存文件存在且是新鲜的”。为此,只需获取缓存文件上的最后修改时间戳,并查看它是否早于缓存生存期。
query2-1234-blue.xml
这可能是10分钟,10小时,10个请求,无论你喜欢什么。
我在上面说过,XML是缓存文件中数据格式的一个很好的选择。 ADO有一个SaveAsXML方法,您也可以使用查询附加的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
子句直接从SQL2008生成XML。
如果“处理器重”部分不是查询和检索,而是生成html页面,那么您可以应用相同的方法,但只需直接缓存html文件。