ASP講座シリーズ(9) 対象範囲の設定
著者:Eve Cole
更新時間:2009-05-30 19:59:07
オブジェクトのスコープによって、どのスクリプトがそのオブジェクトを使用できるかが決まります。デフォルトでは、オブジェクト インスタンスを作成すると、オブジェクトにはページ スコープが設定されます。同じ ASP ページ内のすべてのスクリプト コマンドで、ページ スコープのオブジェクトを使用できます。オブジェクトは、ASP ページがクライアントに送り返されるときに解放されます。ほとんどのオブジェクトでは、推奨されるスコープはページ スコープです。オブジェクトのスコープを変更して、他のページのスクリプトで使用できるようにすることができます。このトピックでは、ページ スコープのオブジェクトの使用方法とオブジェクトのスコープの変更方法について説明します。
ページ スコープ オブジェクトの使用 ASP ページ上で Server.CreateObject を使用して作成されたオブジェクトは、ページの存続期間中存在します。このオブジェクトは、ページのすべてのスクリプト コマンドからアクセスでき、ASP がページの処理を終了すると解放されます。したがって、オブジェクトにはページのスコープまたは有効期間があります。
Visual Basic または VBScript を使用してプログラミングする場合は、ASP がページの処理を完了するまでオブジェクトを解放しないように注意してください。たとえば、次のステートメントは、オブジェクト変数に値 Nothing を割り当ててオブジェクトを解放するためによく使用されます。
myObj = なしを設定します
このステートメントを ASP ページに含めると、myObj を使用しようとすると予期されたエラー コードが返されます。ただし、内部的には、ASP はオブジェクトが解放された後もオブジェクトへの参照を保持します。スクリプトでオブジェクトを使用できない場合、ASP がページの処理を完了するまでオブジェクトのリソースは解放されません。同様に、別のオブジェクト インスタンスを作成し、それをすでに使用されているオブジェクト変数に割り当てることによってオブジェクトを解放すると、ASP は元のオブジェクト インスタンスへの参照を保持します。ほとんどのスクリプトでは、複数のオブジェクトを作成しても問題は発生しませんが、オブジェクトがデータベース接続などの共有リソースを使用する場合、問題が発生する可能性があります。
オブジェクトにはページ スコープがあるため、オブジェクトを手動で解放することに依存しないでください。たとえば、次のループでは 1001 個の Connection オブジェクトが作成され、大規模な SQL サーバーに対してもほとんどの接続を開くことができます。
<%
I = 0 ~ 1000 の場合
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open「接続文字列」
次
%>
一般に、ループ内でオブジェクトを作成することは避ける必要があります。やむを得ない場合は、オブジェクトが使用しているリソースを手動で解放する必要があります。 Connection オブジェクトが 1 回だけ作成され、データ リソースへの物理接続がループごとに開閉される場合、上記の例は正常に機能します。
<%
Set Conn = Server.CreateObject("ADODB.Connection")
I = 0 ~ 1000 の場合
Conn.Open「接続文字列」
接続を閉じる
次
%>
オブジェクトにセッション スコープを与える アプリケーションでは、新しいセッションごとにセッション スコープ オブジェクトが作成され、セッションの終了後に解放されます。したがって、アクティブなセッションごとに 1 つのオブジェクトが存在します。セッション スコープは、複数のスクリプトから呼び出されるオブジェクトに使用されますが、影響するのは 1 つのユーザー セッションのみです。必要な場合にのみ、オブジェクト セッション スコープを指定できます。セッション スコープを使用する必要がある場合は、オブジェクトを提供するコンポーネントのスレッド モデルを理解する必要があります。これは、オブジェクトのパフォーマンスとセキュリティ環境に影響を与えるためです。詳細については、このトピックの「詳細情報: パフォーマンスの問題」を参照してください。
オブジェクト セッション スコープを指定するには、ASP セッション組み込みオブジェクトにオブジェクトを保存します。Global.asa ファイルの <OBJECT> タグを使用するか、ASP ページで Server.CreateObject メソッドを使用してセッションを作成します。スコープ付きオブジェクト。
Global.asa ファイルでは、RUNAT 属性 (Sever に設定する必要がある) と SCOPE 属性 (Session に設定する必要がある) を拡張する ;OBJECT> タグを使用できます。次の例では、Ad Rotator オブジェクトのセッション スコープのインスタンスを作成します。
<OBJECT RUNAT=サーバー SCOPE=セッション ID=MyAd PROGID="MSWC.Adrotator">
</オブジェクト>
オブジェクトを Session オブジェクトに保存すると、アプリケーションのどのページからでもそのオブジェクトにアクセスできるようになります。次のステートメントは、前の例の <OBJECT> タグによって作成されたオブジェクト インスタンスを使用します。
<%= MyAd.GetAdvertising("addata.txt") %>
ASP ページでは、Server.CreateObject メソッドを使用してオブジェクトを Session 組み込みオブジェクトに保存することもできます。次の例では、Ad Rotator オブジェクトのインスタンスを Session オブジェクトに保存します。
<% Set Session("MyAd") = Server.CreateObject("MSWC.Adrotator") %>
広告を表示するには、まず Session オブジェクトに格納されている Ad Rotator オブジェクトのインスタンスを取得し、次にメソッドを呼び出してオブジェクトを表示する必要があります。
<% Set MyAd = Session("MyAd") %>
<%= MyAd.GetAdvertising("addata.txt") %>
ASP は、.asp ファイル内のスクリプト コマンドによって参照されるまで、<OBJECT> タグで宣言されたオブジェクトのインスタンスを作成しません。 Server.CreateObject メソッドは、オブジェクトのインスタンスをすぐに作成します。したがって、セッション スコープのオブジェクトには Server.CreateObject プロパティよりも <OBJECT> タグを使用することをお勧めします。
オブジェクトにアプリケーションスコープを与える
アプリケーション スコープ オブジェクトは、アプリケーションの起動時に作成されるオブジェクトの単一インスタンスです。このオブジェクトはすべてのクライアント要求によって共有されます。オブジェクト アプリケーション スコープを指定する必要があるのはまれなケースです。カウンタなどの一部のユーティリティ オブジェクトには、アプリケーション スコープが必要な場合があります。ただし、一般的には、次のセクションで提案する代替手段を使用できます。さらに、スレッド モデルはパフォーマンスとオブジェクトの安全性環境に影響します (このトピックの「詳細情報: パフォーマンスの問題」を参照)。
オブジェクト アプリケーション スコープを指定して ASP アプリケーション組み込みオブジェクトに保存するには、Global.asa ファイルの <OBJECT> タグを使用するか、ASP ページ オブジェクト インスタンスの Server.CreateObject メソッドを使用してアプリケーション スコープを作成します。 。
Global.asa ファイルでは、RUNAT 属性 (Sever に設定する必要がある) と SCOPE 属性 (Session に設定する必要がある) を拡張する ;OBJECT> タグを使用できます。 ASP ページでは、Server.CreateObject を使用して、アプリケーションの組み込みオブジェクトにオブジェクト インスタンスを格納できます。 <OBJECT> タグと Server.CreateObject の使用例については、前のセクション「オブジェクトにセッション スコープを与える」を参照してください。
セッションおよびアプリケーション スコープの代替方法 必要な場合にのみ、オブジェクト セッションまたはアプリケーション スコープを指定します。これらのオブジェクトはセッションまたはアプリケーションが終了するまで残るためです。これらは、他の方法でより役立つ可能性のあるメモリやデータベース接続などのリソースを消費します。さらに、コンポーネントのスレッド モデルは、コンポーネントから作成するオブジェクト、特にセッション スコープまたはアプリケーション スコープを持つオブジェクトのパフォーマンスに影響します。
多くの場合、アプリケーション スコープまたはセッション スコープのオブジェクトを作成するよりも優れたアプローチは、セッション スコープまたはアプリケーション スコープの変数を使用して、ページ レベルで作成されたオブジェクトに情報を渡すことです。たとえば、ADO 接続オブジェクトにセッションまたはアプリケーション スコープを指定しないでください。これは、スクリプトが ODBC 接続共有を使用しなくなる間、作成される接続が長期間開いたままになるためです。ただし、ODBC 接続文字列をセッションまたはアプリケーションの組み込みオブジェクトに保存し、Web ページ上に作成された Connection オブジェクト インスタンスから文字列を取得することができます。この方法により、頻繁に使用される情報をセッションまたはアプリケーションの名前空間に保存し、必要な場合にのみその情報を含むオブジェクトを作成できます。
ユーザー定義の JScript オブジェクト 新しいオブジェクトのプロパティとメソッドを作成および初期化するコンストラクターを定義することにより、独自の JScript オブジェクトを作成できます。スクリプトが new 演算子を使用してコンストラクターを呼び出すと、オブジェクトのインスタンスが作成されます。 ASP スクリプトはユーザー定義オブジェクトをサポートしており、ページ スコープがある場合に適切に機能します。ただし、ユーザー定義の JScript オブジェクトにアプリケーション スコープまたはセッション スコープが指定されている場合、オブジェクトの機能に影響を与える可能性があります。特に、オブジェクトにセッション スコープまたはアプリケーション スコープがある場合、他のページのスクリプトはオブジェクトのプロパティを取得できますが、そのメソッドを呼び出すことはできません。
詳細情報: パフォーマンスの問題 コンポーネントのスレッド モデルは、Web サイトのパフォーマンスに影響を与える可能性があります。一般に、「両方」とマークされたオブジェクトは、すべての ASP スクリプト、特にセッション オブジェクトとアプリケーション オブジェクトで使用することをお勧めします。シングルスレッドのオブジェクトは非推奨になりました。
使用するオブジェクトのスレッド モデルを常に制御できるとは限らないため、次のガイドラインは最適なパフォーマンスを達成するのに役立ちます。
ページスコープオブジェクト。 Both または Apartment とマークされたオブジェクトは、最高のパフォーマンスを提供します。
アプリケーションスコープオブジェクト。一般に、Application オブジェクトにオブジェクトを配置することは避けてください。アプリケーション スコープのオブジェクトを使用する必要がある場合は、 Both タグ付きオブジェクトと FreeThreadedMarshaler を組み合わせて使用すると、最高のパフォーマンスが得られます。 <OBJECT> タグを使用するか、Server.CreateObject メソッドを使用して、Single、Free、または Both タグを持つオブジェクトを Application オブジェクトに格納できます。アパートメント スレッドのオブジェクトでは <OBJECT> タグを使用する必要があります。
セッションスコープオブジェクト。 Both とマークされたオブジェクトは最高のパフォーマンスを提供します。シングルスレッドまたはアパートメントスレッドのオブジェクトを使用すると、Web サーバーが 1 つのスレッドでセッションをロックします。フリースレッド オブジェクトはセッションをロックしませんが、実行速度はそれほど速くありません。 Session オブジェクトでは、<OBJECT> タグまたは Server.CreateObject メソッドを使用してオブジェクトを保存できます。
SDK ドキュメントをインストールしている場合は、スレッド モデルとそれが意味するコンポーネントのパフォーマンスに関する詳細情報を入手できます。 (SDK ドキュメントは Windows 95 以降では利用できません。)