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



  COLUMN    オブジェクトプーリング

 ジャストインタイムアクティベータは,メソッドの呼び出しから戻ったときにDoneフラグがTrueに設定されていたならば,そのCOMオブジェクトを破棄してしまう機能を備えている。しかし,こうしてCOMオブジェクトを破棄してしまうのは,少々もったいないという考え方もある。なぜなら,COMオブジェクトを破棄したり実体化したりするには,COMオブジェクトをメモリに割り当てるための時間がかかるからである。

 「それならば,COMオブジェクトを破棄するのではなく,溜めておいてCOMクライアント間で使い回すようにすればよいではないか」。このような思想で実装されているのが,オブジェクトプーリングである。オブジェクトプーリングは,非アクティブ状態になったCOMオブジェクトを一定個数だけ溜めておく。そして,COMクライアントがCOMオブジェクトを利用しようとした場合,新規にCOMオブジェクトを実体化するのではなく,溜めて置いたCOMオブジェクトを取り出して使用する(Fig.5-15)。こうすることで,1つのCOMオブジェクトを複数のCOMクライアントが使い回せるようになるのである。

Fig.5-15 オブジェクトプーリング
fig5_15.gif

 オブジェクトプーリングは,コンポーネントサービス管理ツールのCOMコンポーネントのプロパティにおける[アクティブ化]のページで設定する(Fig.5-16)。

Fig.5-16 COMコンポーネントのプロパティ
fig5_16.gif

 オブジェクトプーリングを有効にするには,[オブジェクトのプールを有効にする]にチェックを付け,どれだけの個数のCOMオブジェクトを保存しておくのかを[最小プールサイズ]と[最大プールサイズ]で指定する。また,[タイムアウトの作成]では,COMクライアントから何ミリ秒間利用されなければそのCOMオブジェクトを破棄するのかを設定する。

 COM+は,初めてCOMオブジェクトが使われるときに,最小プールサイズで指定した数だけのCOMオブジェクトを実体化し,オブジェクトプールに溜める。

 ただし,COMコンポーネント側で特別なメソッドを実装しておかないと,このオプションを利用することはできない。そのメソッドとは,ObjectControlインタフェースのCanBePooledメソッドである。CanBePooledメソッドは,COMオブジェクトが破棄されるまえに呼び出されるメソッドである。このメソッドでTrueを返すと,このCOMオブジェクトはオブジェクトプーリングをサポートしていることになる。したがってCOM+側は,そのCOMオブジェクトを本当に破棄するのではなく,オブジェクトプーリングに溜めておき,あとから再利用してよいと判断する。CanBePooledメソッドがFalseを返す場合,もしくはCanBePooledメソッドが実装されていない場合(これはObjectControlインタフェースが実装されていない場合と同義)には,オブジェクトプーリングの機能は使えない。

 さらに,COMコンポーネントがオブジェクトプーリングをサポートするには,COMコンポーネントがマルチスレッドアパートメントモデル(MTA)もしくはニュートラルアパートメントモデル(NA)で作られている必要がある。Visual Basicではシングルスレッドアパートメントモデル(STA)しか実装できないので,オブジェクトプーリングをサポートするCOMコンポーネントは作れない。そのため,Visual Basicで実装したCOMコンポーネントのプロパティページでは,[オブジェクトのプールを有効にする]の設定が淡色表示され,設定できない状態となる。

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