オブジェクトの有効期間と状態の制御
プールされたオブジェクトは、IObjectControl を実装することで、COM+ がプール内のアクティビティを管理する方法に参加できます。 プールされたオブジェクトが作成されると、オブジェクトのライフサイクルの通常のポイントで IObjectControl で次のメソッドを呼び出すことによって、オブジェクトを管理する大きなオブジェクトに集約されます。
- Activate - オブジェクトがクライアントに返されるたびに呼び出され、特定のコンテキストでアクティブ化されます。
- 非アクティブ化: オブジェクトがクライアントによって解放されたとき、または JIT でアクティブ化されたオブジェクトの場合は、非アクティブ化されたときに呼び出されます。
- CanBePooled - オブジェクトが一般プールに返されるたびに呼び出されます。
IObjectControl の実装は省略可能です。トランザクション オブジェクトを除き、常に CanBePooled を実装して保持しているリソースの状態を監視する必要があります。 ただし、以下で説明するように、プールされたオブジェクトの動作を効率的に管理する方法が提供されるため、ほとんどの場合、IObjectControl を実装することをお勧めします。
コンテキスト固有の初期化の実行
Activate を使用すると、特定のクライアントに対してアクティブ化されるコンテキストでオブジェクトを初期化できます。 たとえば、オブジェクトにトランザクション アフィニティがあるかどうかを判断するために (そのリソースが既に参加している可能性があります)、コンテキストに関連付けられているトランザクション ID を取得できます。
通常、Activateを使用して初期化を実行します。この初期化は、オブジェクトによって公開されるすべてのメソッドで一貫性があり、オブジェクトのコンストラクターのコンテキスト固有の部分として扱われます。
クライアント状態のクリーンアップ
非アクティブ化を使用すると、オブジェクトが完全に汎用的な状態でプールに戻り、セキュリティや分離を損なうことなく任意のクライアントで使用できるように、存在する可能性のあるクライアント固有の状態を取り除くことができます。
オブジェクトの再利用の制御
CanBePooled を使用すると、オブジェクトの内部状態を監視し、再利用に適しているかどうかを報告できます。 CanBePooled が True を返し、プールの最大値に達していない場合、オブジェクトは一般的なプールに戻されます。 CanBePooled が False を返す場合、オブジェクトは disカード されます。 トランザクション コンポーネントの場合、False を返すと、現在のトランザクションが終了します。
通常は、オブジェクトのグローバル データ メンバーを保持し、接続が悪い、または何らかのリソースが不適切な状態であることが検出された場合は、現在の状況を反映するように設定し、CanBePooled を介して返します。
オブジェクトが CanBePooled を実装していない場合、インスタンスはプールの最大レベルに達するまで引き続き再利用されます。
関連トピック