次の方法で共有


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

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

メモ

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

 

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

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

COM+によって提供されるディスペンサーマネージャーは、リソースディスペンサーを追跡し、それらの間で調整します。 2つのインターフェイス、すなわちIDispenserManagerIHolderを実装します。 リソースディスペンサーは、IDispenserManagerを使用して自らを登録します。 次にディスペンサーマネージャーが、リソースディスペンサーがディスペンサーマネージャーにアクティビティを通知するために使用するIHolderへのポインターをリソースディスペンサーに送ります。

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

メモ

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

 

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

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

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

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

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

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