プール可能オブジェクトの要件
プール可能オブジェクトは、複数のクライアントが単一のオブジェクト インスタンスを使用可能にするため、特定の要件を満たす必要があります。
ステートレス
セキュリティ、一貫性、分離を維持するため、プール可能オブジェクトはクライアントからクライアントへのクライアント固有の状態を保持してはなりません。 IObjectControl を使用し、IObjectControl::Activate を使用してコンテキスト固有の初期化を実行した後、IObjectControl::Deactivate を使ってクライアント状態をクリーンアップすることにより、クライアントごとの状態を管理できます。 詳しくは、「オブジェクトの有効期間と状態の制御」をご覧ください。
スレッド アフィニティなし
プール可能オブジェクトを特定のスレッドにバインドすることはできません。バインドすると、パフォーマンスが大幅に低下する可能性があります。 このため、プール可能オブジェクトをアパートメント モデルで実行されるようマークすることはできません。マルチスレッド アパートメントまたはニュートラル アパートメントで実行する必要があります。 加えて、プール可能オブジェクトがスレッド ローカル ストレージを使用したり、フリー スレッド マーシャラーを集計したりすることはできません。 COM+ でのスレッド処理について詳しくは、「COM+ スレッド モデル」をご覧ください。
Note
Microsoft Visual Basic 6.0 以前の開発環境では、アパートメント モデル コンポーネントのみ作成できます。 ただし、Visual Basic .NET ではコンポーネントをプールできます。
Aggregatable
プール可能オブジェクトは集計をサポートする必要があります。つまり、NULL 以外の pUnkOuter 引数を使って CoCreateInstance を呼び出すことによって作成をサポートする必要があります。 COM+ は、プールされたオブジェクトをアクティブ化するとき、プールされたオブジェクトの有効期間を管理し、IObjectControl でメソッドを呼び出すために、集計を作成します。 集計可能オブジェクトの書き込みについて詳しくは、「集計」をご覧ください。
トランザクション コンポーネント
トランザクションに参加するプール可能オブジェクトは、管理対象リソースを手動で参加させる必要があります。 プールされている間、オブジェクトがデータベース接続などの管理対象リソースを保持している場合、特定のコンテキストでオブジェクトがアクティブ化されると、リソース マネージャーがトランザクションに自動的に参加する方法はなります。 そのため、オブジェクト自体は、トランザクションを検出して、リソース マネージャーの自動参加を無効にし、保持しているリソースを手動で参加させるロジックを処理する必要があります。 加えて、トランザクション プールされたオブジェクトには、IObjectControl::CanBePooled のパラメーター値におけるそのリソースの現在の状態が反映されている必要があります。 詳しくは、「トランザクション オブジェクトのプール」をご覧ください。
IObjectControl の実装によるオブジェクトの有効期間の管理
プール可能オブジェクトは IObjectControl を実装しますが、厳密には必須ではありません。 ただし、プールされたトランザクション コンポーネントは、IObjectControl を実装する必要があります。 これらのコンポーネントは、保持しているリソースの状態を監視し、再利用できないタイミングを示している必要があります。IObjectControl::CanBePooled が false を返すと、トランザクションが終了します。 詳しくは、「オブジェクトの有効期間と状態の制御」をご覧ください。
言語の制限
Microsoft Visual Basic 6.0 以前を使って開発されたコンポーネントは、アパートメント モデルによってスレッド化されるため、プールできません。 ただし、Visual Basic .NET ではコンポーネントをプールできます。
レガシ コンポーネント
非トランザクションであり、前述の該当する要件に準拠している限り、コンポーネントはプール機能を念頭に置いて具体的に記述されていなくてもプールすることができます。 IObjectControl の実装は必須ではありません。実施しないコンポーネントは、その有効期間の管理には参加しません。 IObjectControl::CanBePooled が実装されていない場合、プールが最大サイズになるまでオブジェクトは再利用され続けます。
関連トピック