COM+ Just-In-Time アクティベーションの概念
Just-In-Time (JIT) アクティベーション サービスを使用すると、クライアントがそのオブジェクトへのアクティブな参照を保持したまま、COM+ でオブジェクトを非アクティブ化できます。 次回、クライアントがまだアクティブであると思われるオブジェクトに対してメソッドを呼び出すときに、COM+ JIT アクティベーション サービスは、オブジェクトをクライアントに対して透過的に、ジャスト イン タイムで再アクティブ化します。
COM + JIT アクティベーションを使用する主な利点は、クライアントが必要な限りオブジェクトへの参照を保持できるようにすることです。メモリなどの重要なサーバー リソースを必ずしも解放する必要はありません。 その他の重要な利点は次のとおりです。
COM+ JIT アクティベーション サービスを使用すると、クライアントがコストの高いサーバー オブジェクトとサーバー リソースを使用する方法を考慮する必要がないため、クライアントのプログラミング モデルが大幅に簡略化されます。 JIT アクティベーションがないと、クライアントが頻繁にオブジェクトを呼び出して解放する必要がある場合に、大きな負担が発生する可能性があります。
Note
COM+ オブジェクト プール サービスを使用すると、このパフォーマンス上の利点をさらに向上できます。 JIT でアクティベーションされたオブジェクトをプールすることで、保持している可能性のあるリソースを再利用しながら、クライアントのオブジェクトの再アクティベーションを大幅に高速化でき、サーバー上の特定のオブジェクトによって使用されるメモリ量をより正確に制御できます。 詳細については、「オブジェクト プールと COM+ JIT アクティベーション」を参照してください。
分散型アプリケーションでは、すべてのオブジェクトの作成にコストのかかるネットワーク ラウンドトリップが必要であり、クライアントがサーバーから離れるほど、サーバー オブジェクトのアクティベーションとマーシャリング、チャネルの開き、プロキシとスタブの設定のコストが高くなります。 COM+ JIT アクティベーション サービスを使用すると、オブジェクト作成の頻度を最小限に抑えて、アプリケーションのパフォーマンスを大幅に向上させることができます。
COM+ JIT アクティベーションを使用して、クライアントが有効期間の長い参照を保持しているが、必ずしも常に使用しているとは限らないオブジェクトをアクティベーションする場合、サーバーのメモリは常にそれらのオブジェクトをアクティブに保ち続けるわけではありません。 これにより、アプリケーションのスケーラビリティが大幅に向上する可能性があります。 クライアントが見る唯一のパフォーマンスの低下は、COM+ がオブジェクトを再アクティブ化するのにかかる時間です。通常は、オブジェクトにメモリを割り当てるのに要する時間よりもわずかに長く、リモート オブジェクト作成のネットワーク ラウンドトリップよりも大幅に短くなります。
COM+ JIT アクティベーションの有効化
コンポーネントに対して COM+ JIT アクティベーション サービスを有効にするには、コンポーネント サービス管理ツールまたは管理機能を使用します。 これを行う方法の詳細については、「コンポーネントの JIT アクティベーションの有効化」を参照してください。
COM+ JIT アクティベーションは、次のような他の COM+ サービスと相互に作用できます。
- コンポーネントでトランザクションが必要な場合、JIT アクティベーションは自動的に有効になります。 詳細については、「トランザクションと COM+ JIT アクティベーション」を参照してください。
- コンポーネントで JIT アクティベーションが有効になっている場合、同期は自動的に必須に設定されます。 これは、2 つのクライアントが JIT でアクティブ化されたコンポーネントを同時に呼び出し、そのうちの 1 つのメソッド呼び出しが返され、オブジェクトが非アクティブ化された場合、もう一方が一時中断されないことを意味します。
非アクティブ化がトリガーされる仕組み
COM+ は、オブジェクト コンテキストの完了ビットの状態に基づいてオブジェクトを非アクティブ化します。 オブジェクトは、このビットを使用して、特定のメソッド呼び出し中に、それが完了したか (つまり、非アクティブ化の準備ができているか) どうかを通知できます。 詳細については、「完了ビットの設定」を参照してください。
Auto-Done プロパティの使用
コンポーネント サービス管理ツールを使用すると、メソッドの戻り時にオブジェクトが自動的に非アクティブになるようにメソッドを構成できます。 (このプロパティを設定する方法の手順については、「メソッドの auto-done の有効化」を参照してください。) このオプションを選択すると、トランザクションでの投票に対する繰り返しのメソッド呼び出しを排除することができます。 整合性ビットの既定の設定が True であるため、完了ビットも True に変更済みで、これらの設定を変更するアクションを実行しない場合は、メソッドが戻った後に IObjectContext::SetComplete が自動的に呼び出されます。
ただし、この動作には 1 つの注意事項があります。COM+ は、メソッドが返す HRESULT を調べます。 その HRESULT がエラーを示す場合、整合性ビットは False に設定され、結果は IObjectContext::SetAbort を呼び出した場合と同じになります。
要約すると、メソッドに対して自動完了を選択し、ビットを設定するためのアクションを実行せず、HRESULT(hr) が返された場合は、次のようになります。
- SUCCEEDS(hr) の場合は、SetComplete を呼び出したのと同じようになります。
- FAILED(hr) の場合は、SetAbort を呼び出したのと同じようになります。
IObjectControl を使用してオブジェクトのアクティブ化と非アクティブ化を管理する
IObjectControl インターフェイスを実装すると、オブジェクトの非アクティブ化と再アクティブ化を COM+ ランタイムで自動的に管理するようにできます。 オブジェクトがこのインターフェイスを実装すると、COM+ は、オブジェクトを非アクティブ化するときに IObjectControl::Deactivate を呼び出し、再アクティブ化するときに IObjectControl::Activate を呼び出します。 これらのメソッドを使用すると、オブジェクトのアクティブ化時のコンテキストの自動初期化と、非アクティブ化時の状態のクリーンアップを有効にすることができます。
COM+ JIT アクティベーションを使用するオブジェクトをプールする場合は、IObjectControl を実装することを強くお勧めします。 詳細については、「オブジェクト プールと COM+ JIT アクティベーション」を参照してください。
ステートレスと JIT アクティベーション
トランザクション オブジェクトは、トランザクションの境界を越えて状態を共有できないため、必然的にステートレスになります。 そのため、JIT アクティベーションは、非アクティブ化時に失われる状態がオブジェクトに保持されていない場合にのみ使用します。それ以外の場合は、トランザクションの分離に違反します。 トランザクション オブジェクトの性質的な使用パターン (何らかの単位の作業を行い、トランザクションがコミットまたはアボートしたときにオブジェクトを解放する) により、JIT アクティベーションと自動トランザクションは密接に関連しています。 トランザクションを要求するようにオブジェクトを構成すると、COM+ JIT アクティベーションが自動的に有効になります。
関連トピック