我正在运行一个带有 SQL2008 数据库的经典 vbscript ASP 站点。有一些页面需要大量处理器,但实际上并不经常更改。理想情况下,我希望服务器每晚处理一次这些,也许是 HTML 页面,然后可以离开服务器,而不必为每个用户处理。
有什么想法可以实现吗?
应用程序本身运行良好,所以我不热衷于用另一种脚本语言重写整个东西,即使经典的 asp 有点过头了!!
我正在运行一个带有 SQL2008 数据库的经典 vbscript ASP 站点。有一些页面需要大量处理器,但实际上并不经常更改。理想情况下,我希望服务器每晚处理一次这些,也许是 HTML 页面,然后可以离开服务器,而不必为每个用户处理。
有什么想法可以实现吗?
应用程序本身运行良好,所以我不热衷于用另一种脚本语言重写整个东西,即使经典的 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 个请求,无论你喜欢什么。
上面说过,对于cachefile中的数据格式,XML是一个不错的选择。ADO 有一个 SaveAsXML 方法,您还可以使用FOR XML附加到查询的子句直接从 SQL2008 生成 XML。
如果“处理器重”部分不是查询和检索,而是生成 html 页面,那么您可以应用相同的方法,只是直接缓存 html 文件。