2012-07-04 113 views
0

我正在運行一個經典的vbscript ASP站點和SQL2008數據庫。有幾頁處理器很重,但實際上並沒有經常改變。理想情況下,我希望服務器每晚處理一次這些數據(可能放入HTML頁面),然後再從服務器上飛走,而不必爲每個用戶處理。前處理(經典)ASP頁面

任何想法,我可以做到這一點?

該應用程序本身工作得很好,所以我不想用另一種腳本語言重寫整個事情,即使經典的asp有點過山!

+0

這聽起來有點像一些我從其他網站獲取數據的頁面。我對它們進行了修改,以便在表格中保存數據的緩存副本以及指示何時獲取數據的日期/時間。緩存滿足大部分請求,但是如果數據已經過時,則更新緩存。您可以使用SQL Server中的計劃作業來更新緩存的數據。如果問題全部在ASP VBscript方面,請查看<您最喜愛的搜索引擎>:緩存經典ASP頁面 – HABO

回答

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的查詢參數,那麼當p1p2分別具有值1234blue時,緩存文件可能被命名爲cache-1234-blue.xml。如果您有5個不同的查詢,則可以將它們緩存爲query1-1234-blue.xmlquery2-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文件。

+0

非常感謝這個Cheeso!在解決這個問題的時候,我有一些頁面的查詢量很大,以及一些HTML代碼更多,所以你的優秀答案涵蓋了兩個方面。 –