この特集のトップページへ
Chapter 5:ビジネスロジック層の構築

head1.gif 5.3 ジャストインタイムアクティベータ

 そろそろトランザクションの説明に入りたいところなのだが,そのまえにどうしても説明しておかなければならない機能がある。それは「ジャストインタイムアクティベータ(JITA)」と呼ばれるものである。ジャストインタイムアクティベータとは,必要になったときにCOMコンポーネントを実体化し,不要になったならば,たとえCOMクライアントが使っていても実体化されたCOMオブジェクトを破棄してしまうという,少々乱暴な機能である。

 ジャストインタイムアクティベータは,トランザクションとも深くかかわっている。そこでまず,トランザクションの説明に入るまえに,ジャストインタイムアクティベータとはどのような機能で,どのように役立つのかについて説明する。

head2.gif 5.3.1 ジャストインタイムアクティベータの基本
 ジャストインタイムアクティベータの基本な機能は,「必要になったときにCOMコンポーネントを実体化し,必要でないときには破棄する」という点にある。ジャストインタイムアクティベータはデフォルトの状態では無効である。ジャストインタイムアクティベータを有効にするには,コンポーネントサービス管理ツールでCOMコンポーネントのプロパティを表示し,[アクティブ化]ページで[ジャストインタイムアクティベージョンを有効にする]にチェックを付ける(Fig.5-10)。なお,詳しくは「5.4 COM+のトランザクション機能」で説明するが,トランザクション機能を有効にしたCOMオブジェクトは,自動的にジャストインタイムアクティベータが有効になる(無効にすることはできない)。

Fig.5-10 ジャストインタイムアクティベータの有効化
fig5_10.gif

 ジャストインタイムアクティベータが有効になっていると,COMコンポーネントの実体化の手順と破棄の手順が,若干変わってくる。

 まず,COMクライアントがCOM+の管理下にあるCOMコンポーネントをNewキーワードやCreateObject関数で実体化したとする。このとき,ジャストインタイムアクティベータが有効になっている場合,COM+はインタセプタしか作らず,COMコンポーネントを実体化してCOMオブジェクトを作らない。そして,COMオブジェクトに対してメソッドの呼び出しやプロパティの参照があったときに初めて,COMコンポーネントを実体化してCOMオブジェクトを作る。COMオブジェクトに備わるメソッドが呼び出されたりプロパティの参照があったときにCOMオブジェクトを実体化する作業のことをCOMオブジェクトのアクティブ化と呼ぶ(Fig.5-11)。

Fig.5-11 COMオブジェクトのアクティブ化
fig5_11.gif

 これが,ジャストインタイムアクティベータを有効にしたときにCOMオブジェクトを実体化するときの処理である。Fig.5-11で示したように,メソッドが呼び出されたりプロパティが参照されたりするまで,COMオブジェクトを実体化するタイミングが遅延されるという点にポイントがある。

 次に,COMオブジェクトが破棄されるときの手順について説明する。

 一般には,COMオブジェクトを使っているCOMクライアントが1つもなくなったとき,Visual Basicでいえば,COMオブジェクトを保持している変数にNothingが代入されたときに,COMオブジェクトが破棄される。しかし,ジャストインタイムアクティベータが有効である場合,COM+の管理下にあるCOMオブジェクトの生存期間はコンテキストに含まれるDoneフラグで管理されるため,COMオブジェクトを使っているCOMクライアントが存在するときでも破棄されることがある。

 Doneフラグは,TrueFalseかのどちらかの状態を持つもので,COMオブジェクトがメソッドから戻るときに明示的に設定する。COMオブジェクトが特に何もしなければDoneフラグはFalseである。DoneフラグをTrueに設定するには,ObjectContextオブジェクトが備えるSetCompleteメソッドまたはSetAbortメソッドを呼び出す。SetCompleteメソッドはトランザクションをコミットしてDoneフラグをTrueにするメソッドであり,SetAbortメソッドはトランザクションをアボートしてDoneフラグをTrueにするメソッドである。このメソッドの詳細は,「5.4 COM+のトランザクション機能」で説明するが,ここではどちらのメソッドもDoneフラグをTrueに設定するものであるとだけ理解していただきたい。

 COMオブジェクトのメソッドから戻ったときには,COM+のインタセプタが,このDoneフラグを調べる。DoneフラグがFalseの場合には何もしないが,Trueに設定されていた場合,インタセプタは,そのCOMオブジェクトを破棄し,インタセプタだけを残す。この処理は,非アクティブ化(ディアクティベート)と呼ばれる(Fig.5-12)。

Fig.5-12 COMオブジェクトの非アクティブ化
fig5_12.gif

 Fig.5-12の状態において,COMオブジェクトは破棄されているが,インタセプタは残っているため,COMクライアントからは,まだそのCOMオブジェクトが存在しているように見える。もし,非アクティブ化された状態のときに,COMクライアントがCOMオブジェクトのメソッドを呼び出したり,プロパティを参照したりした場合には,Fig.5-11のようにアクティブ化され,またCOMオブジェクトが実体化されることになる。

 なぜ,このような機構が実装されているかというと,サーバー側のリソースを減らすためである。N階層アプリケーションモデルにおいては,複数のCOMクライアントが同時にサーバー側でCOMオブジェクトを利用する。そのため,もし数千のCOMクライアントが同時にCOMオブジェクトを利用したとすると,サーバー上にも数千のCOMオブジェクトが存在することになる。実行を終えたCOMオブジェクトをCOMクライアントがすぐに解放してくれればよいが,そうとも限らない。そこで,ジャストインタイムアクティベータでは,COMオブジェクト側でDoneフラグをTrueに設定することで,クライアントが明示的に破棄しなくても,自ら破棄させる機能を提供しているのである。つまり,メソッドが呼ばれているあいだだけCOMオブジェクトをメモリ上に存在させ,メソッドから戻ったならばCOMオブジェクトを破棄する仕組みを用意することで,たくさんのCOMオブジェクトが同時にサーバー上に存在しないようにするのである。ただし,ここでいうリソースとは,COMオブジェクトが占めるメモリ領域のことを表しているわけではない。主にデータベースコネクションなど,COMオブジェクトが利用しているサーバー側のリソースのことを意味している。この点については,「5.4.5 リソースディスペンサ」で説明する。

 もっとも,ジャストインタイムアクティベータの機能を使うかどうかは開発者の実装に依存する。COMオブジェクトがメソッドの呼び出しから戻るときにDoneフラグをセットしなければ,COMオブジェクトは破棄されない。よって,ジャストインタイムアクティベータを有効に設定したとしても,COMオブジェクト側でDoneフラグの操作をしていなければ無意味である。

prevpg.gif Chapter 5-1 9/23 nextpg.gif