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 アクティブ化サービスを有効にするには、Component Services 管理ツールまたは管理機能を使用します。 これを行う方法の詳細については、「 コンポーネントの JIT アクティベーションの有効化」を参照してください。

COM+ JIT アクティブ化は、次のような他の COM+ サービスと対話できます。

  • コンポーネントでトランザクションが必要な場合は、JIT アクティブ化が自動的に有効になります。 詳細については、「 トランザクションと COM+ JIT アクティブ化」を参照してください。
  • コンポーネントで JIT アクティブ化が有効になっている場合、同期は自動的に必須に設定されます。 つまり、2 つのクライアントが JIT でアクティブ化されたコンポーネントを同時に呼び出し、そのうちの 1 つのメソッド呼び出しが返され、オブジェクトが非アクティブ化された場合、もう一方は残されません。

非アクティブ化のトリガー方法

COM+ は、オブジェクト コンテキストの完了ビットの状態に基づいてオブジェクトを非アクティブ化します。 オブジェクトは、このビットを使用して、特定のメソッド呼び出し中に完了した (つまり、非アクティブ化する準備ができている) かどうかを通知できます。 詳細については、「 完了ビットの設定」を参照してください。

Auto-Done プロパティの使用

Component Services 管理ツールを使用すると、メソッドの戻り時にオブジェクトが自動的に非アクティブになるようにメソッドを構成できます。 (このプロパティを設定する方法については、 メソッドの自動完了の有効化 を参照してください)。このオプションを選択すると、トランザクションでの投票に対する繰り返しのメソッド呼び出しを排除できます。 整合性ビットの既定の設定は True であるため、完了ビットも True に変更し、これらの設定を変更するアクションを実行しない場合、メソッドが戻った後に IObjectContext::SetComplete が自動的に呼び出されます。

ただし、この動作には注意が 1 つあります。COM+ は、メソッドが返す HRESULT を調べます。 その HRESULT がエラーを示す場合、整合性ビットは False に設定され、結果は IObjectContext::SetAbort を呼び出した場合と同じです。

要約すると、メソッドに対して自動完了を選択し、ビットを設定するためのアクションを実行せず、HRESULT(hr) が返された場合は、次のことが適用されます。

  • SUCCEEDS(hr) の場合は 、SetComplete を呼び出したかのように表示されます。
  • FAILED(hr) の場合は 、SetAbort を呼び出したかのように表示されます。

IObjectControl を使用してオブジェクトのアクティブ化と非アクティブ化を管理する

オブジェクトの非アクティブ化と再アクティブ化を COM+ ランタイムが自動的に管理できるように、 IObjectControl インターフェイスを実装できます。 オブジェクトがこのインターフェイスを実装すると、COM+ はオブジェクトを 非アクティブ化するときに IObjectControl::D eactivate を呼び出し、再アクティブ化するときに IObjectControl::Activate を 呼び出します。 これらのメソッドを使用すると、オブジェクトのアクティブ化時のコンテキストの自動初期化と、非アクティブ化時の状態のクリーンアップが可能になります。

COM+ JIT アクティブ化を使用するオブジェクトをプールする場合は、 IObjectControl を実装することを強くお勧めします。 詳細については、「 オブジェクト プールと COM+ JIT アクティブ化」を参照してください。

ステートレスと JIT アクティブ化

トランザクション オブジェクトは、トランザクション境界を越えて状態を共有できないため、必ずしもステートレスです。 したがって、JIT アクティブ化は、非アクティブ化時に失われる状態がオブジェクトに保持されていない場合にのみ使用します。それ以外の場合は、トランザクションの分離に違反します。 トランザクション オブジェクトの自然な使用パターン (トランザクションのコミットまたは中止時に一部の作業単位を実行してオブジェクトを解放する) により、JIT アクティブ化と自動トランザクションは密接に関連しています。 トランザクションを要求するようにオブジェクトを構成すると、COM+ JIT アクティブ化が自動的に有効になります。

COM+ Just-In-Time アクティブ化タスク

オブジェクト プールと COM+ JIT アクティブ化

トランザクションと COM+ JIT アクティブ化