0

SQL2008データベースを使用して従来のvbscriptASPサイトを実行しています。プロセッサを多用するページがいくつかありますが、実際にはそれほど頻繁には変更されません。理想的には、サーバーがこれらを1晩に1回、おそらくHTMLページに処理して、ユーザーごとに処理するのではなく、サーバーから飛び出せるようにしたいのです。

これを実現する方法はありますか?

アプリケーション自体は非常にうまく機能するので、古典的なaspが少し丘を越えていても、すべてを別のスクリプト言語で書き直すことには熱心ではありません。

4

1 に答える 1

1

はい :

ページのどの部分が「プロセッサに負荷がかかる」かを指定していませんが、SQLデータのクエリと処理であると想定します。1つのアイデアは、データを取得して、ファイルシステムにキャッシュファイルとして保存することです。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およびにそれぞれp21234とが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メソッドがあり、クエリに追加された句を使用してSQL2008から直接XMLを生成することもできFOR XMLます。


「プロセッサが重い」部分がクエリと取得ではなく、htmlページの生成である場合は、同じ種類のアプローチを適用できますが、htmlファイルを直接キャッシュするだけです。

于 2012-07-04T16:35:33.750 に答える