COM+ リソース ディスペンサーの概念

アプリケーション コンポーネントは、COM+ リソース ディスペンサーを使用して、コンポーネントと特定のリソース マネージャー間の接続など、共有された、測定不可能な状態情報にアクセスして管理します。 実行時には、データベース接続、ネットワーク接続、キューへの接続、スレッド、オブジェクト、メモリ ブロックなどのリソースの動的プールがリソース ディスペンサーで使用できるようになります。 アプリケーション プロセスでは、使用頻度の高い最小限のリソースを使用して高パフォーマンスを実現します。 リソース ディスペンサーは、トランザクションと再利用を自動化することもできます。 (この機能の詳細については、「 リソースの自動再利用 」を参照してください)。

Note

リソースは、 リソース ディスペンサーによって作成される何かです。 たとえば、リソース マネージャーへの接続は一般的なリソースです。 リソースはリソース ディスペンサーのメモリ内に存在し、ディスペンサー マネージャーにコピーされることはありません。 リソースは不透明ハンドル (RESID) によってのみ認識され、トランザクションを実行できる場合と実行できない場合があります。 多くの場合、管理されるリソースは永続的な状態を管理するコンポーネントへの接続である場合がありますが、接続自体は永続的ではありません。 リソース ディスペンサーは、多くの場合、関連するリソース マネージャーを使用して永続的な状態を保持します。

 

アーキテクチャ上、COM+ リソース ディスペンサー システムは、リソース ディスペンサーとディスペンサー マネージャーで構成されています。 リソース ディスペンサーは、共有リソースへの簡単なインターフェイスをアプリケーションに提供する、ユーザーが提供するコンポーネントです。 ディスペンサーマネージャーは、COM+によって提供されるコンポーネントであり、さまざまなリソースディスペンサーのアクティビティを調整します。

リソース ディスペンサーは、少なくとも 2 つのインターフェイスを提供するダイナミック リンク ライブラリ (DLL) コンポーネントです。 1 つ目の IDispenserDriver は、ディスペンサー マネージャーに、管理するリソースを作成、破棄、参加させる方法に関する基本情報を提供します。 2 つ目はアプリケーションに公開され、COM インターフェイスまたはインターフェイスのセットにすることも、インポート ライブラリを介してコンポーネントがリンクされているアプリケーション プログラミング インターフェイス (API) にすることもできます。 アプリケーションは、任意のリソース ディスペンサーを呼び出すことができます。次に、任意の API をアプリケーションに提供できます。 リソース ディスペンサーが Automation コンポーネントの場合は、Microsoft Visual Basicからアクセスできます。 リソース ディスペンサーは、アプリケーション コンポーネントがリソース ディスペンサーを参照するときにインスタンス化されます。

COM+ が提供するディスペンサー マネージャーは、リソース ディスペンサーとその間の座標を追跡します。 IDispenserManagerIHolder の 2 つのインターフェイスを実装します。 リソース ディスペンサーは 、IDispenserManager インターフェイスを使用して自身を登録します。 その後、ディスペンサー マネージャーは、ディスペンサー マネージャーにアクティビティを通知するために使用する IHolder へのポインターを提供します。

トランザクション リソース ディスペンサーは、分散トランザクション コーディネーター (DTC) トランザクションに参加する必要があります。 これは、OLE トランザクションに準拠している内部または外部 (リソース ディスペンサーに対する) リソース マネージャーの使用を意味します。

Note

COM+ プログラミング モデルには、アプリケーション オブジェクトが有効期間中に実行する作業を保護するのに役立つ 宣言型トランザクションが含まれています。 アプリケーション オブジェクトが COM+ リソース ディスペンサーを使用する場合、実行される作業は自動的にトランザクションになります。つまり、コンポーネントはトランザクションを明示的に宣言する必要はありません。 これらのトランザクションは、OLE トランザクション仕様で定義され、DTC によって実装され、COM+ によってアプリケーション オブジェクトに代わって開始されます。 詳細については、DTC 開発ガイドを参照してください。

 

リソースはトランザクションである必要はありません。 非トランザクション リソースをプールするリソース ディスペンサーでは、アプリケーション オブジェクトがこれらのリソースの共有プールにアクセスできるようにすることで、高パフォーマンスを実現できます。 この種類のリソース ディスペンサーは IDispenserDriver::EnlistResource メソッドからS_FALSEを返します。これは、リソースがトランザクションでないため、リソース ディスペンサーがリソースに参加しなかったことを意味します。

リソース ディスペンサーは COM+ とは独立して機能し、リソース プール機能のみを提供することもできます。 たとえば、リソース ディスペンサーが API (ODBC など) を公開している場合、リソース ディスペンサーは、インポート ライブラリ (または LoadLibrary 関数と GetProcAddress 関数を使用して) を介してアプリケーションによってアクセスされる DLL である可能性があります。 リソース ディスペンサーは、 CoCreateInstance を呼び出すことによってアプリケーションがアクセスする COM コンポーネントである場合もあります。 COM+ がない場合、ディスペンサー マネージャーは現在のコンポーネント トランザクションを認識していないため、リソース ディスペンサーの EnlistResource メソッドを呼び出すことはありません。

起動時に、リソース ディスペンサー DLL はディスペンサー マネージャーに自身を登録する必要があります。 ディスペンサー マネージャーは、リソース ディスペンサーの読み込みとアンロードを管理し、COM+ コンテキストを提供し、インベントリ統計マネージャーを制御する管理責任者です。 (詳細については、 COM+ ディスペンサー マネージャーを参照してください)。リソース ディスペンサーは最初に GetDispenserManager 関数を呼び出し、次に IDispenserManager::RegisterDispenser メソッドを 呼び出し、リソース ディスペンサーが実装する IDispenserDriver ポインターを渡します。 この呼び出しは、 IHolder への参照を返します。

シャットダウンするには、リソース ディスペンサーが IHolder::Close を呼び出します。 クリーン パッケージのシャットダウンを確実に行うには、COM+ がディスペンサーにシャットダウンを要求した後も、ビジネス オブジェクトから呼び出しが引き続き到着する状況をリソース ディスペンサーが処理できる必要があります。

このセクションの次のトピックでは、COM+ リソース ディスペンサー サービスの詳細について説明します。

COM+ リソース ディスペンサーのタスク