データをキャッシュする
ASP ページにアクセスしてきたクライアントが必要とする情報を提供する方法には、基本的に次の 2 種類があります。
- データベースに保持されているデータなど、サーバー リソースから得た情報を渡す
- アプリケーションの内部から得た情報を渡す
アプリケーションの外部にあるリソースからデータを取得する場合、処理に必要な手順が増えるので、アプリケーション スペース内部からデータを生成するよりも長い時間がかかります。
これからブラウザに送信するデータが、過去に行われた要求によって既に準備されていた場合、このデータがキャッシュに格納されていれば、アプリケーションでより高速にデータを取得することができます。このようなキャッシュ方法は "出力キャッシング" と呼ばれます。異なる多数の要求に対して、同じ書式で同じデータを返す場合、出力キャッシングが特に適しています。 たとえば、入力フォームの開発に共通する作業の 1 つに、ドロップダウン リスト ボックスのリスト内容として、一定で変化しないデータを集めることがあります。このような一定不変のデータに対する更新は、自動的にフォームに反映されるので、HTML ページへ直接エントリを書き込むよりも適しています。
次のスクリプトは、出力キャッシングの例です。この例では、getSportsListBox 関数により、一定不変のデータを使用してリスト ボックスが作成されます。このリスト ボックスはアプリケーション スペースに追加されるため、クライアントが個別にリスト ボックスに値を入力する場合に、より速く、クライアントからリスト ボックスにアクセスできます。この例では、DSN "Sports" は同じサーバーに定義されているものと仮定しています。
<%@ LANGUAGE=JavaScript %><HTML><BODY>
<FORM METHOD=post>
What is your favorite sport? <%= getSportsListBox() %>
<P>
<INPUT TYPE=submit>
</FORM>
</BODY>
</HTML>
<%
function getSportsListBox()
{
SportsListBox = Application("SportsListBox")
If (SportsListBox != null) return SportsListBox;
crlf = String.fromCharCode(13, 10)
SportsListBox = "<select name=Sports>" + crlf;
SQL = "SELECT SportName FROM Sports ORDER BY SportName";
cnnSports = Server.CreateObject("ADODB.Connection");
cnnSports.Open("Sports", "WebUser", "WebPassword");
rstSports = cnnSports.Execute(SQL);
fldSportName = rstSports("SportName");
While (!rstSports.EOF)
{ SportsListBox = SportsListBox + " <option>" + fldSportName + "</option>" + crlf; rstSports.MoveNext(); }
SportsListBox = SportsListBox + "</select>"
Application("SportsListBox") = SportsListBox
return SportsListBox;
}
%>
場合によっては、アプリケーションによって受信された、同じデータに対する複数の異なる要求ごとに、データの表示方法を変更する必要があります。このような場合は "入力キャッシング" を使用します。入力キャッシングでは、データは保存されますが、表示形式は保存されません。入力キャッシングを実行するには、VBScript に用意されている Dictionary オブジェクト、または ADO レコードセットを使用して、データをキャッシュします。
次の例では、アプリケーションに コネクションレス レコードセットを追加することにより、データをキャッシュしています。この後、アプリケーション スペース内の ASP スクリプトにより、データベースからデータが取得されるのではなく、レコードセットがアクセスされるようになります。次の 2 つの ASP スクリプトは、このテクニックを使用した例です。
Global.asa からの引用
<OBJECT ID=rsCustomers PROGID="ADODB.Recordset" RUNAT="Server" SCOPE="Application">
</OBJECT><!--METADATA TYPE="TypeLib" FILE = "C:\Program Files\Common Files\system\ado\msado15.dll"
-->
<% SQL = "SELECT CompanyName, City FROM Customers" Cnn = "DSN=AdvWorks" rsCustomers.CursorLocation = adUseClient rsCustomers.Open SQL, Cnn, adOpenStatic, AdLockReadOnly rsCustomers.ActiveConnection = Nothing
Set myCustomers = Application("rsCustomers").Clone Set CompanyName = myCustomers("CompanyName") Set City = myCustomers("City")
Do Until myCustomers.EOF%><B><%= CompanyName %></B> is located in <B><%= City %></B>.<P>
<%
myCustomers.MoveNext
Loop
%>
このアプリケーションの Global.asa ファイルにより、レコードセットが作成され、アプリケーション スペースへ追加されます。次に、ASP スクリプトによりレコードセットにレコードが読み込まれ、ActiveConnection プロパティが Nothing に設定されて、コネクションレスになります。続けて、このレコードセットが複製されて、値がすべて繰り返されます。これは、データベース本体にアクセスするより、ずっと高速です。このテクニックはレコードセットにレコードを読み込むのに使用されるデータが比較的安定していると分かっている場合にのみ適しています。