オブジェクト プールのしくみ
プールされるようコンポーネントを構成すると、COM+ は、そのインスタンスをプール内に維持し、コンポーネントを要求するあらゆるクライアントに対してアクティブ化する準備が整います。 オブジェクト作成要求は、プール マネージャーを通じて処理されます。
プールが構成され、コンポーネント単位で維持されます。 プールは、同じ CLSID を共有する同種オブジェクトで構成されます。 唯一の例外は、トランザクションが保留中の間、トランザクション アフィニティを持つオブジェクトを含むサブプールが維持されているトランザクション オブジェクトの場合です。
アプリケーションが起動すると、オブジェクトの作成が成功する限り、管理者として指定した最小レベルまでプールが設定されます。 コンポーネントに対するクライアント要求が入ってくると、プールからの先着順で要求が満たされます。 プールされたオブジェクトに使用可能なものがなく、プールがまだ指定された最大レベルにない場合、クライアントに対して新しいオブジェクトが作成され、アクティブ化されます。
プールが最大レベルに達すると、クライアント要求はキューに登録され、最初に使用可能なオブジェクトをプールから受け取ります。 アクティブ化と非アクティブ化の両方を含むオブジェクトの数が、プールの最大値を超えることはありません。 クライアントがオブジェクト作成を待機する期間を制御できるよう、オブジェクト作成要求は、管理者として指定した期間の後タイムアウトします。 タイムアウト エラーが発生すると、クライアントは CoCreateInstance から E_TIMEOUT エラーを返します。
COM+ は、オブジェクトがクライアントによって解放された後、プールが最大レベルに達するまで、可能な限りオブジェクトの再利用を試みます。 オブジェクトは、その状態を監視して再利用できるかどうかを判断し、IObjectControl::CanBePooled の適切な値を返します。
プールされたオブジェクトが作成されると、オブジェクトの有効期間を管理する大きなオブジェクトに集計されます。 外側のオブジェクトは、次のように、オブジェクトのライフ サイクルにおける適切なタイミングで IObjectControl のメソッドを呼び出します。
- Activate メソッドは、オブジェクトがクライアントに返されるたびに呼び出され、特定のコンテキストでアクティブ化されます。
- Deactivate メソッドは、オブジェクトがクライアントによって解放されるたび、または JIT アクティベーション オブジェクトの場合は非アクティブ化されたときに呼び出されます。
- CanBePooled メソッドは、オブジェクトが汎用プールに返されるたびに呼び出されます。 一部の再利用可能なリソースが正しくない状態であることをオブジェクトが検出した場合、このメソッドに対して FALSE を返す必要があり、プール マネージャーはオブジェクト カードを無効にします。
オブジェクトは必ずしも IObjectControl を実装する必要はありません。 そうでない場合、プールの最大レベルに達するまで、インスタンスは必ず再利用されます。
プールされるコンポーネントを構成する方法について詳しくは、「プールされるコンポーネントの構成」をご覧ください。
関連トピック