我正在運行一個經典的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