アプリケーション・モジュール・プールについて

クライアントは、プール内のアプリケーション・モジュール・インスタンスを使用できます。この機能をアプリケーション・モジュール・プールと呼びます。これには、次の利点があります。

たとえば、あるWebアプリケーションを最大1000人のユーザーが使用できる場合に、特定のアプリケーション・モジュールは同時に100人のユーザーしか使用しないとします。このような場合に、アプリケーション・モジュール・プールを使用します。あるクライアントでアプリケーション・モジュール・インスタンスが必要になると、そのクライアントは、プール内の空きインスタンスを取得し、トランザクションをコミットまたはロールバックした後で、プールに解放します。インスタンスはあらかじめ作成されているため、エンド・ユーザーは、タスクを実行する際にアプリケーション・モジュールをインスタンス化する時間が短縮されます。通常は、WebベースのJSPクライアントでプールを使用します。アプリケーション・モジュール・プールに最大100個のアプリケーション・モジュール・インスタンスがあるようにするには、単にプロパティを設定するだけです。

JVMごとに1つのプール・マネージャ

Business Components for Javaフレームワークは、アプリケーション・モジュール・プールを管理するためのプール・マネージャを提供します。各WebサーバーのJVMに対して1つのプール・マネージャが用意されます。アプリケーション・モジュール・インスタンスは、削除されるまで、またはJVMが停止するまでプールに保持されます。インスタンスの最大数を指定することもできます。プール・マネージャは、フレームワーク・クラスPoolMgrで定義されます。

アプリケーション・モジュール構成ごとに1つのアプリケーション・モジュール・プール

通常は、アプリケーション・モジュール構成ごとに、1つのアプリケーション・モジュール・プールが用意されます。たとえば1つのWebサーバーには、アプリケーション・モジュールのタイプごとに、クライアントがアクセス可能な1つのプールがあります。

次の図は、デプロイされた3つのアプリケーション・モジュール(TaskApp、StatusAppおよびMTBFApp)が、アプリケーション・モジュール・プールをどのように使用するかを表しています。TaskApp、StatusAppおよびMTBFAppには、それぞれアプリケーション・モジュール・プールがあります。これらのプールは、プール・マネージャにより管理されます。それぞれのプールは、アプリケーション・モジュール・インスタンスを管理します。インスタンスは、データベース・サーバーに接続されます。

Figure that illustrates the pieces involved in application module pooling, as described in the preceding paragraph.

アプリケーション・モジュール・インスタンスの作成、割当ておよび解放方法

通常、アプリケーション・モジュール・プールの機能は次のように実装されます。

  1. クライアントが、WebサーバーにHTTPリクエストを送信します。
  2. リクエストでアプリケーション・モジュール・インスタンスが必要な場合、WebサーバーのWebアプリケーションは、プール・マネージャが作成されているかどうかを最初に確認します。作成されていない場合はこれを作成します。
  3. Webアプリケーションは、プール・マネージャにアプリケーション・モジュール・プールを要求します。作成されていない場合はこれを作成します。
  4. Webアプリケーションは、アプリケーション・モジュール・プールからアプリケーション・モジュール・インスタンスをチェックアウトします。
  5. Webアプリケーションは、要求されたサービスを実行するためにアプリケーション・モジュール・インスタンスを使用します。
  6. Webアプリケーションは、アプリケーション・モジュール・インスタンスをプールに解放します。解放モードには、後述の3つのタイプがあります。
    インスタンスがプールに解放されると、他のプール・セッションで再利用できます。

ビジネス・コンポーネント・フレームワークで提供される3つの解放モード

Business Components for Javaにより提供されているWebアプリケーション・フレームワーク(Data Web BeanおよびJSPタグなど)は、プールから取得されたアプリケーション・モジュール・インスタンスを解放する3つのモード(ステートフル、ステートレスおよびリザーブ)をサポートしています。インスタンスの割当て方法、インスタンスの状態を保持するかどうか、およびフェイルオーバーをサポートするかどうかを決定できます。

ステートフル

ステートフルJSPアプリケーションでは、JSPアプリケーションのデータ・タグまたはData Web Beanは、起動されるたびに同じアプリケーション・モジュール・インスタンスにアクセスするわけではありません。ただしステートレス・アプリケーションとは異なり、Business Components for Javaは、アプリケーション・モジュールが解放された際にアプリケーション・モジュールの状態をデータベース、ファイルまたはメモリーに保存し、ビュー・オブジェクトの行セットで、1回起動されたものが次に起動されるまで、同じものが保持されます。ステートフル・モードでは、データベースのフェイルオーバー・サポートが用意されており、アプリケーション・モジュールの再利用もできるため、このモードが推奨されます。ただし、JSPアプリケーションに同時に多数のユーザーがアクセスする場合には、ステートレス・モードの使用が必要な場合もあります。ステートレス・オプションでは、より多くのユーザーが同時にJSPアプリケーションにアクセスできます。jbo.passivationstoreプロパティを使用してアプリケーション・モジュールの状態の保存先を変更できます。

ステートレス

個別のJSPページまたはJSPアプリケーション全体でステートレス・オプションを選択した場合、データ・タグまたはData Web Beanは、特定のHTTPセッションで新しいページが起動されるたびに、必ず同じアプリケーション・モジュール・インスタンスにアクセスするわけではありません。このためビュー・オブジェクトの(1回起動されたものが次に起動されるまで同じものが保持されている)行セットは使用できません。各HTTPセッションはアプリケーション・モジュールごとに独自のインスタンスを取得しません。すべてのHTTPセッションが、各アプリケーション・モジュールの限定されたインスタンスのプールを共有します。

リザーブ

個別のJSPページまたはJSPアプリケーション全体でリザーブ・モードを選択した場合、データ・タグまたはData Web Beanが一度アプリケーション・モジュールに接続されると、同じHTTPセッション中では、任意のデータ・タグやData Web Beanからのアプリケーション・モジュールに対する後続の接続がすべて、アプリケーション・モジュールの同じインスタンスに接続されます。これは、後続の接続が別のJSPページからの場合も、同じJSPページの新規の起動の場合も同じです。このモードはステートフル・アプリケーションと似ていますが、フェイルオーバーはサポートしていません。また、アプリケーション・モジュールを再利用できません。リザーブ・モードは主に、標準外のJDBC接続を使用するアプリケーション・モジュールとの互換性を実現する目的で用意されています。リザーブ・モードを使用すると、HTTPリクエスト間の即時ロックを保持できます。

JSPページでのプールの使用方法は、「JSPページおよびBC4Jアプリケーション・モジュール・プールについて」を参照してください。

以前のリリースのステートフル・モードは、今回のリリースでリザーブ・モードとなっていることに注意してください。ただし、以前のコードは下位互換できるようにしておく必要があります。

アプリケーション・モジュール・インスタンスの状態の保持

ステートフル・モードを使用した場合は、リクエスト間でアプリケーション・モジュール・インスタンスのトランザクション状態が保持されます。アプリケーション・モジュール・インスタンスを占有しなくても、各自のプログラムでユーザーのデータを保持できます。トランザクション状態には、アプリケーション・モジュールのビュー・オブジェクトの現在の状態、すべての変更された属性と新規行、および問合せ、WHERE句、WHERE句のパラメータなどのビュー・オブジェクトの復元に必要な、その他のビュー・オブジェクト固有の状態が含まれます。フレームワークによってセッションの状態が管理され、Cookieは必要ありません。

ステートフル・アプリケーション・モジュールのチェックインでは、フェイルオーバーのサポートが指定されている場合(デフォルト)は、アプリケーション・モジュールをアプリケーション・モジュール・プールにチェックインするとき、アプリケーション・モジュールの状態はデータストア(ファイル、データベースまたはメモリー)で保持されます。フェイルオーバーのサポートが指定されていない場合は、アプリケーション・モジュール・プールでそのアプリケーション・モジュール・インスタンスを再利用する必要があると判断されると、アプリケーション・モジュールの状態が保持されます。アプリケーション・モジュール・プールでアプリケーション・モジュール・インスタンスが再利用されるのは、アプリケーション・モジュールが要求されるとき、アプリケーション・モジュール・プールのサイズが再利用のしきい値よりも大きいとき、およびプール内に使用可能なアプリケーション・モジュール・インスタンスがないときです。ステートフルでないアプリケーション・モジュールを解放しても、アプリケーション・モジュールの状態は保持されません。アプリケーション・モジュールの状態の一意の識別子をクライアント・ブラウザに保存するためにCookieが使用されます。Cookieが生成されるのは、フェイルオーバーのサポートが指定された場合のみです。Cookieは、ステートフル・アプリケーション・モジュールを解放したときに生成されます。

Javaサーブレットでのアプリケーション・モジュール・プールの使用方法は、oracle.jbo.http.HttpSessionCookieのJavadocを参照してください。

HTTPセッションが存在しないクライアントでのアプリケーション・モジュール・プールの使用方法は、oracle.jbo.common.ampool.SessionCookieのJavadocを参照してください。

ステートフル・モードを使用する場合は、プログラムが次の条件を満たす必要があります。

注意: アプリケーション・モジュールの状態が保存される際には、キャッシュ内のデータが保存されます。データベースに変更があった場合、アプリケーション・モジュールの状態を調べる際に、変更が保存したデータに反映されていないことがあります。たとえば、アプリケーション・モジュールが再利用されていない場合は、データには変更が加えられていません。ただしアプリケーション・モジュールが再利用され、フェイルオーバーによってアクティブになっている場合は、アクティブ化ロジックでビュー・オブジェクトが再実行されています。このため、データベースのなんらかの更新によって、対象クライアントの最初の状態に比べて行が増えていたり、減っていたりする可能性があります。

タイムアウトによるアプリケーション・モジュール・インスタンスの占有の防止

休憩などで、ユーザーがブラウザをしばらく開いたままにしておくとどうなるのでしょうか。プール・マネージャはアプリケーション・モジュールをプールに解放するでしょうか。

解放モードがリザーブの場合、WebサーバーによってHttpSessionがタイムアウトになると、アプリケーション・モジュールはプールに解放されます。セッションがタイムアウトになった場合、アプリケーション・モジュールの状態は保持されません。セッション・タイムアウトの詳細は、J2EE仕様を参照してください。

解放モードがステートフルの場合、フェイルオーバーのサポートが要求されていれば、ページが表示され、状態がすぐに保存された後にアプリケーション・モジュールが解放されます。

アプリケーション・モジュール・インスタンスのフェイルオーバーによる保護

ビジネス・ロジック層またはデータベースが、停電などの理由で停止した場合に備えて、データベースにアプリケーション・モジュールの状態を保持しておく場合があります。これには、フェイルオーバーのサポートを有効にします。デフォルトでは、このサポートが有効です。データがデータベースに保存されるため、ビジネス・ロジック層の処理は多少遅くなります。

アプリケーション・モジュール・インスタンスの数の制御

最大プール・サイズおよび初期プール・サイズを設定できます。さらに、最高水位標機能を使用して、プール内のアクティブなアプリケーション・モジュール・インスタンスの平均数を管理できます。


関連項目
アプリケーション・モジュールのプール
アプリケーション・モジュールのプール
JSPプロジェクトのBC4J構成プロパティについて