ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発
12c (12.1.2)
E48099-02
  目次へ移動
目次

前
 
次
 

50 アプリケーション・モジュール・プールと接続プールのチューニング

この章では、ADFビジネス・コンポーネントのアプリケーション・モジュール・プールの動作方式と、アプリケーション・モジュール・プールとデータベース接続プールの両方をチューニングして、アプリケーションのパフォーマンスを最適化する方法について説明します。

この章には次の項が含まれます:

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

アプリケーション・モジュール・プールは、同じタイプのアプリケーション・モジュール・ランタイム・インスタンスのコレクションです。そこにアクセスするユーザー数をプロビジョニングするために、実行時に1つ以上のアプリケーション・モジュール・インスタンスをプールからサービス・ユーザーに提供するように、アプリケーションを構成できます。

プール内の各アプリケーション・モジュール・インスタンスは、複数のブラウザ・クライアントで共有されます。これらのクライアントの標準的な「思考時間」(Webページを送信する間隔)により、アプリケーション・モジュール・コンポーネントの数がシステムで作業しているアクティブ・ユーザーの総数よりも効果的に小さくなるように最適化されます。たとえば、20人のユーザーがそれぞれのブラウザからWebサイトにアクセスしている場合、これらのユーザーと同数のアプリケーション・モジュール・インスタンスではなく、5個または10個のアプリケーション・モジュール・インスタンスでサービスを提供できる可能性があります。つまり、プールは使用可能なアプリケーション・モジュールの数を上回るユーザーにサービスを提供できるだけでなく、この小さなアプリケーション・モジュールのセットへのサービス提供のために中間層が必要とするメモリーが少なくて済むので、ADFアプリケーションを、制限のあるハードウェア・リソース上でさらに拡大可能になります。

設計時の構成を通して、アプリケーション・モジュールを使用すると、完全にステートレスなFusion Webアプリケーションをサポートしたり、複数のブラウザ・ページにまたがる作業ユニットをサポートしたりできます。パフォーマンスを最適化するために、あるアプリケーション・モジュールのインスタンスが「状態管理」モードでプールに返された場合、プールは該当するアプリケーション・モジュールに対するセッション参照を追跡します。このアプリケーション・モジュールのインスタンスはそのままプールに残り、使用できる状態ですが、「セッション・アフィニティ」を維持することによりパフォーマンスが向上するため、前回このインスタンスを使用していたセッションによる使用が望ましいでしょう。

そのため、プール内のアプリケーション・モジュールのインスタンスはどの時点においても、その状態を反映して、次の3つのグループに論理的に分類されます。

アプリケーション・モジュール・プールの構成パラメータおよびそれがプールの動作に与える影響に関する必知事項は、50.2.5項「構成プロパティのスコープに関する必知事項」を参照してください。

50.1.1 Fusion Webアプリケーション実行時に作成されるプールのタイプ

一般的なFusion Webアプリケーション、アプリケーション・モジュール・プールおよびデータベース接続プールの実行時に使用されるプールは、2種類あります。通常、アプリケーションはアプリケーション・モジュール・プールを使用しますが、接続プールは滅多に使用しません。接続プールが使用されるのは、アプリケーションによって、デフォルトのJNDIデータソース接続タイプではなく、JDBC URL接続タイプが定義された場合のみです。まず、ユーザー・アプリケーションで各種のプールをいくつ作成するのかを理解する必要があります。

50.1.1.1 アプリケーション・モジュール・プール

アプリケーション・モジュール・コンポーネントは実行時、次の2つの方法で使用できます。

  • クライアントから直接アクセスされるアプリケーション・モジュールとして使用する

  • 別のアプリケーション・モジュール・インスタンスの中に集約(ネスト)されている再利用可能なコンポーネントとして使用する

クライアントがこれに直接アクセスするときのアプリケーション・モジュールはルート・アプリケーション・モジュールと呼ばれます。クライアントは、クライアントが含むアプリケーション・モジュール・インスタンスの一部として、ネストされているアプリケーション・モジュールに間接的にアクセスします。同一のアプリケーション・モジュールを実行時にこれら両方の方法で使用することも可能ですが、それは一般的ではありません。重要な点は、ADFビジネス・コンポーネントが作成するのは、ルート・アプリケーション・モジュールに対するアプリケーション・モジュール・プールのみであるということです。

基本的には、Java VMのFusion Webアプリケーションにより使用されるルート・アプリケーション・モジュール1つにつき、アプリケーション・モジュール・プールが1つ作成されます。これらのJava VMでは、そのタイプのルート・アプリケーション・モジュールがADFコントローラ・レイヤーにより使用されます。アプリケーションが必要とするアプリケーション・モジュール・プールの数に関連する詳細トピックは、50.4項「デプロイメント環境のシナリオとプーリング」を参照してください。

50.1.1.2 データベース接続プール

Fusion Webアプリケーションにより使用されるデータベース接続プールのタイプは、アプリケーション・モジュールで構成する接続のタイプによって、次のように異なります。

  • JDBC URL(例: jdbc:oracle:thin:@penguin:1521:ORCL)

  • データソースのJNDI名(例: java:comp/env/jdbc/YourConnectionDS)

アプリケーション・モジュールは、デフォルトでデータソース接続タイプを使用するように構成されます。JDBCデータソースは、データベース・サーバー接続をベンダーに依存しない形式でカプセル化したものです。JDBCデータ・ソースは、JDBC URL接続タイプでは得られない利点を提供します。データ・ソースに基づき接続タイプを定義すると、デプロイされたアプリケーションを変更することなく、データ・ソースの再構成が行えます。データ・ソースはアプリケーション・サーバー・レベルで一元定義できますが、JDBC URL接続ではそれが行えません。JDBCデータソースを使用できない場合は、ADFビジネス・コンポーネントにより、データソース接続情報に基づいて実行時にデフォルトのJDBC URLが構成されます。

アプリケーション・モジュールの構成時にJDBC URL接続を指定する(JDBC URLとユーザー名情報をカプセル化するJDeveloper名前付き接続を選択する場合に発生)と、接続プールの管理にADFデータベース接続プールが使用されます。

デフォルト設定を使用し、JDBCデータソースのJNDI名を提供した場合、ADFデータベース接続プールは使用されず、後述のADFデータベース接続プールに関係する構成パラメータは関係なくなります。


注意:

ユーザーのJava EE WebコンテナまたはEJBコンテナ(あるいはその両方)からJNDIによってチェックされるJDBCデータソースのデータベース接続プールを構成するには、Java EEコンテナのドキュメントを参照し、プーリングに関する構成オプションとその設定方法を理解してください。


ADFデータベース接続プーリングを使用する場合、ADFコントローラ・レイヤーの使用するルート・アプリケーションが<JDBCURL,Username>接続を要求している個々のJava VMにある一意の<JDBCURL,Username>ペア1つにつき、データベース接続プールを1つ作成するという基本ルールがあります。アプリケーションが必要とする接続プールの数に関連する詳細トピックは、50.4項「デプロイメント環境のシナリオとプーリング」を参照してください。

50.2 プール構成パラメータの設定

アプリケーション・モジュール・プールの実行時動作は、適切な構成パラメータの設定により制御します。それらのパラメータは、アプリケーション・モジュールの構成で宣言的な設定を行ったり、Java Systemパラメータとして指定したり、または実行時にプログラムで設定したりできます。

50.2.1 構成プロパティの宣言的設定方法

パラメータの表示および設定には、図50-1に示す「構成の編集」ダイアログの「プーリングおよびスケーラビリティ」タブを使用します。

図50-1 「構成の編集」ダイアログの「プーリングおよびスケーラビリティ」タブ

「プーリングおよびスケーラビリティ」タブ

始める前に:

接続プールについて理解しておくと役立ちます。詳細は、50.2項「プール構成パラメータの設定」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。

アプリケーション・モジュールのプーリング構成を編集するには:

  1. 「アプリケーション」ウィンドウで、アプリケーション・モジュールをダブルクリックします。

  2. 概要エディタで、「構成」ナビゲーション・タブをクリックします。

  3. 「構成」ページで、編集する構成をダブルクリックします。

  4. 「構成の編集」ダイアログで、「プーリングおよびスケーラビリティ」タブをクリックして必要な実行時プロパティを編集し、「OK」をクリックして構成の変更内容を保存します。

50.2.2 構成プロパティを宣言的に設定した場合の処理

「構成の編集」ダイアログで指定した値は、アプリケーション・モジュールのXMLドキュメントを基準とする./commonサブディレクトリ内のbc4j.xcfgというXMLファイルに保存されます。同一のJavaパッケージ内の全アプリケーション・モジュールの構成はすべて、この同じファイルに保存されます。通常は、bc4j.xcfgファイルを直接変更するのではなく、「構成の編集」ダイアログを使用してアプリケーション・モジュールの構成の設定を変更します。

たとえば、SummitADFアプリケーション・ワークスペースの./src/oracle/summit/model/services/commonディレクトリの中にあるbc4j.xcfgファイルを見ると、例50-1のように、そのBackOfficeAppModuleアプリケーション・モジュール用に名前の付いた構成が2つあることがわかります。この場合、BackOfficeAppModuleLocal構成とBackOfficeAppModuleShared構成は、Oracle ADFモデル・テスターがJDBC URL接続を使用するように指定しています。JDBC接続の接続詳細は、プロジェクト・ディレクトリとの相対位置指定で./.adf/META-INFと記述されるサブディレクトリにあるconnections.xmlファイルにあります。

例50-1 BackOfficeAppModule用の構成

<BC4JConfig version="11.1" xmlns="http://xmlns.oracle.com/bc4j/configuration">
...
   <AppModuleConfigBag
      ApplicationName="oracle.summit.model.services.BackOfficeAppModule">
      <AppModuleConfig 
            name="BackOfficeAppModuleLocal"
            jbo.project="oracle.summit.model.Model"
            ApplicationName="oracle.summit.model.services.BackOfficeAppModule"
            DeployPlatform="LOCAL" JDBCName="summit_adf">
         <Database jbo.TypeMapEntries="Java"/>
         <Security
            AppModuleJndiName="oracle.summit.model.services.BackOfficeAppModule"/>
      </AppModuleConfig>
      <AppModuleConfig
            name="BackOfficeAppModuleShared"
            jbo.project="oracle.summit.model.Model"
            ApplicationName="oracle.summit.model.services.BackOfficeAppModule"
            DeployPlatform="LOCAL" JDBCName="summit_adf">
         <AM-Pooling jbo.ampool.maxpoolsize="1"
                     jbo.ampool.isuseexclusive="false"/>
         <Database jbo.TypeMapEntries="Java"/>
         <Security
            AppModuleJndiName="oracle.summit.model.services.BackOfficeAppModule"/>
      </AppModuleConfig>
   </AppModuleConfigBag>
</BC4JConfig>

ここで、<AppModuleConfig>タグの子要素の属性にはjboで始まる名前が付けられています。これは、そのADFビジネス・コンポーネント・プロパティの名前と一致しています(たとえば、<AM-Pooling>タグは、プロパティjbo.ampool.maxpoolsizeに対応する属性jbo.ampool.maxpoolsizeを定義します)。また、「構成の編集」ダイアログで、あるプロパティが実行時のデフォルト値に設定されている場合、JDeveloperはこのエントリをbc4j.xcfgファイルに書き込まないことを理解しておくことも重要です。

50.2.3 構成プロパティをシステム・パラメータとして設定する方法

構成プロパティは、bc4j.xcfgファイルで指定するのみでなく、同じプロパティ名を持つJava VMシステム・パラメータとして設定することもできます。これらのシステム・パラメータは、問題のアプリケーション・モジュールに関連するbc4j.xcfgファイルに対応するプロパティが存在しない場合のみ使用されます。つまり、アプリケーション・モジュール構成内の構成パラメータは、Javaシステム・パラメータとして指定した同名のパラメータより優先されます。

特定のJava VMで実行されているすべてのADFアプリケーションが特定のパラメータに対して同じ構成値の設定を必要としている場合は、構成プロパティをJava VMシステム・パラメータとして設定すると便利です。この場合、bc4j.xcfgファイルでは構成プロパティを設定せず、「構成の編集」ダイアログには目的のプロパティの値が表示されていないことを確認する必要があります。詳細は、50.2.1項「構成プロパティの宣言的設定方法」を参照してください。

通常、Javaシステム・パラメータは、次のようにJava VMに対するコマンドライン・フラグ-Dを使用して設定します。

java -Dproperty=value -jar yourserver.jar

また、Java EEコンテナの場合はその独自の構成ファイルの中にセクションがあり、そこではJava EEコンテナの起動時に使用されるJavaシステム・パラメータを指定できます。

Javaシステム・パラメータとして、Oracle ADF構成パラメータにサイト固有のデフォルト値を指定する方法を使用する場合、これらのグローバルなデフォルト値にアプリケーション・モジュール固有の例外を定義するのではないかぎり、アプリケーションのbc4j.xcfgファイルに、これらのパラメータへの参照が含まれないことを確認する必要があります。


注意:

アプリケーション・プールおよびデータベース接続プールの両方の「アイドル・インスタンス・タイムアウト」および「プール・ポーリング間隔」の設定値は、ダイアログでは数として表示および編集されますが、構成ファイルにはミリ秒単位で保存されます。これら4つのパラメータの値をJavaシステム・パラメータとして指定する場合や、bc4j.xcfgファイルを手作業で編集する場合は、それらの時間間隔値をミリ秒の単位で指定してください。


50.2.4 構成プロパティをプログラム的に設定する方法

実行時にアプリケーションによってアプリケーション・モジュール構成プロパティを制御する必要がある場合は、ADFビジネス・コンポーネントAPIを使用してこれらのプロパティを動的に設定できます。たとえば、一般的なADFアプリケーションでは、アプリケーション・モジュールによって静的なJDBCデータソースが構成されます。しかし、アプリケーションで、ユーザーに応じて様々なデータベースからデータを表示する必要がある場合、データソース名とアプリケーション・モジュール・プールのパラメータを実行時に設定することがあります。

oracle.jbo.common.ampoolパッケージにEnvInfoProviderインタフェースを実装するJavaクラスを作成すると、構成プロパティをプログラムによって設定できます。クラス内では、例50-2に示すように、getInfo()メソッドをオーバーライドしてput()をコールし、渡される環境ハッシュ表に値を格納します。

例50-2 カスタムなEnvInfoProviderを使用した環境プロパティの設定

package devguide.advanced.customenv.view;
import java.util.Hashtable;
import oracle.jbo.common.ampool.EnvInfoProvider;
/**
 * Custom EnvInfoProvider implementation to set
 * environment properties programmatically
 */
public class CustomEnvInfoProvider implements EnvInfoProvider {
  /**
   * Overridden framework method to set custom values in the
   * environment hashtable.
   * 
   * @param string - ignore
   * @param environment Hashtable of config parameters
   * @return null - not used
   */
  public Object getInfo(String string, Object environment) {
    Hashtable envHashtable = (Hashtable)environment;
    envHashtable.put("some.property.name","some value");
    return null;
  }
  /* Required to implement EnvInfoProvider */
  public void modifyInitialContext(Object object) {}
  /* Required to implement EnvInfoProvider */
  public int getNumOfRetries() {return 0;}
}

ConfigurationクラスのcreateRootApplicationModule()メソッドを使用してステートレスなクライアントまたはコマンドラインクライアント用のアプリケーション・モジュールを作成する場合は、カスタムなEnvInfoProviderを第2引数(オプション)として渡すことができます。カスタムなEnvInfoProviderをADF Webベース・アプリケーションで使用するには、例50-3で示すように、セッションCookieファクトリのカスタム・クラスを実装する必要があります。カスタムなセッションCookieファクトリを使用するには、構成プロパティjbo.ampool.sessioncookiefactoryclassに、セッションCookieファクトリのカスタム・クラスの完全修飾名を設定します。

例50-3 カスタムなEnvInfoProviderをインストールするためのカスタムなSessionCookieFactory

package devguide.advanced.customenv.view;
import java.util.Properties;
import oracle.jbo.common.ampool.ApplicationPool;
import oracle.jbo.common.ampool.EnvInfoProvider;
import oracle.jbo.common.ampool.SessionCookie;
import oracle.jbo.http.HttpSessionCookieFactory;
/**
 * Example of custom http session cookie factory
 * to install a custom EnvInfoProvider implementation
 * for an ADF web-based application.
 */
public class CustomHttpSessionCookieFactory
       extends HttpSessionCookieFactory {
  public SessionCookie createSessionCookie(String appId,
                                           String sessionId, 
                                           ApplicationPool pool,
                                           Properties props) {
    SessionCookie cookie =
      super.createSessionCookie(appId, sessionId,pool, props);
    EnvInfoProvider envInfoProv = new CustomEnvInfoProvider();
    cookie.setEnvInfoProvider(envInfoProv);
    return cookie;
  }
}

50.2.5 構成プロパティのスコープに関する必知事項

ADFビジネス・コンポーネントが使用する各ランタイム構成プロパティには、スコープが1つあります。各プロパティのスコープは、該当するプロパティ値が評価されるタイミングと、その値が単一のJava VM内で効果的に共有される(すなわち静的である)か否かを示します。ADFビジネス・コンポーネントのPropertyManagerクラスは、サポートされているすべてのプロパティから構成されるレジストリです。定義されるのは、プロパティの名前、デフォルト値およびスコープです。このクラスにはmain()メソッドが含まれているので、該当クラスをコマンドラインから実行して、全構成プロパティ情報のリストを表示できます。

JDEVHOMEがJDeveloperのインストール・ディレクトリである場合、この一連の設定値のリストを表示するには、次のコマンドを実行します。

$ java -cp JDEVHOME/BC4J/lib/bc4jmt.jar oracle.jbo.common.PropertyManager

このコマンドを発行すると、ADFビジネス・コンポーネントの構成プロパティがすべてコンソールに送られます。また、構成プロパティ値を設定できる様々なレベルおよびそれらのレベルの優先度を示す便利な参考情報もリスト表示されます。

---------------------------------------------------------------
Properties loaded from following sources, in order:
1. Client environment [Provided programmatically
                       or declaratively in bc4j.xcfg]
2. Applet tags
3. -D flags (appear in System.properties)
4. bc4j.properties file (in current directory)
5. /oracle/jbo/BC4J.properties resource
6. /oracle/jbo/commom.jboserver.properties resource
7. /oracle/jbo/common.Diagnostic.properties resource
8. System defined default
---------------------------------------------------------------

どのプロパティも、次のいずれか1つのスコープとともにリスト表示されます。

  • MetaObjectManager

    このスコープのプロパティは、ADF PropertyManagerが初めて初期化される際、Java VMごとに一度初期化されます。

  • SessionImpl

    このスコープのプロパティは、ApplicationModule.prepareSession()が起動されるたびに一度初期化されます。

  • Configuration

    このスコープのプロパティは、アプリケーション・モジュール・プールが初めて作成され、該当するアプリケーション・モジュールの構成が初めて読み込まれるときに初期化されます。

  • Diagnostic

    このスコープのプロパティは、ADFビジネス・コンポーネントの組込み診断機能に固有なものです。

これらのどのスコープでも、一連のプロパティが初期化される際に、前述のレイヤー化された値の解決が実行されます。クライアント環境(解決順序のレベル1)でプロパティ値が指定されていれば、これらが初期化されたときには必ず、システム・パラメータ(解決順序レベル3)に指定された値よりも優先されます。

クライアント環境は、一連の名前/値のペアから構成されるハッシュ表であり、プログラムによって移入することも、Configurationオブジェクト(ロードされると、名前/値のペアとともにbc4j.xcfgファイルに該当エントリが含まれる)によって自動移入することもできます。つまり、MetaObjectManagerレベルでスコープの対象となるプロパティの場合は、次の両方の処理を実行するのが、該当する一連のプロパティに対し全アプリケーション・モジュールで同じデフォルト値を確実に使用するための最も信頼性の高い方法です。

  1. 該当するプロパティ値が、どのアプリケーション・モジュールのbc4j.xcfgファイルの構成名/値のペア・エントリにも表示されないようにする。

  2. 実行環境内のJavaシステム・プロパティを使用してプロパティ値を設定する。

そのかわり、もし、MetaObjectManagerスコープのプロパティをbc4j.xcfgファイルに残した場合、Java VMの起動後にプールが作成される最初のアプリケーション・モジュールの構成に指定された値に対して望ましくない処理が行われます。

50.2.6 データベースとアプリケーション・モジュール・プールの連携に関する必知事項

ADFアプリケーション・モジュール・プールがデータベース接続プールを使用する方法は、アプリケーション・モジュール構成パラメータjbo.doconnectionpoolingの設定によって異なります。図50-1に示された「構成の編集」ダイアログの「プーリングおよびスケーラビリティ」ページでは、「解放時にアプリケーション・モジュールの切断」チェック・ボックスを使用してこのパラメータを設定します。


注意:

プールへリリースしたときに、アプリケーション・モジュールを切断しているというイメージは、関連するパラメータ名(jbo.doconnectionpooling)よりも、実際の機能が行っていることをよくとらえています。jbo.doconnectionpooling=falseと設定しても、データベース接続プーリングが実行されないわけではありません。これは、アプリケーション・モジュール・プールに戻されるときのチェックインの際、アプリケーション・モジュールがそのJDBC接続から切断されないという意味です。


jbo.doconnectionpooling=falseのデフォルト設定を使用した場合、任意のプールでアプリケーション・モジュール・インスタンスが作成されると、適切な接続プールから(ADFの場合はJDBC URLに基づいて、JNDIデータソース名の場合は基礎となるJDBCデータソース実装のプールから)JDBC接続が取得されます。このアプリケーション・モジュール・インスタンスは、アプリケーション・モジュール・プールから削除されるまで、プールから取得したJDBC接続オブジェクトをしっかりと維持し続けます。このアプリケーション・モジュール・インスタンスは存続期間中、多数の様々なユーザーにサービスを提供しますが、ADFがデータベース接続でのロールバックの発行に注意しているため、様々なユーザーが保留中のデータベース状態を混同してしまうことはありません。JDBC接続を確保することにより、複数のクライアントによるその後のアクセスの間、各アプリケーション・モジュール・インスタンスはJDBC PreparedStatementオブジェクトがキャッシュされ、再使用可能な状態を保ち続けることができるため、最高のパフォーマンスが得られます。

jbo.doconnectionpooling=trueの場合は、ユーザー・セッションがアプリケーション・モジュールの使用を終える(通常は各HTTPリクエストの終了時)たびに、アプリケーション・モジュール・インスタンスが該当するリクエストで使用していたJDBC接続を切断し、そのJDBC接続をJDBC接続プールに返します。該当するアプリケーション・モジュール・インスタンスは、ユーザー・セッションによって次回使用されるとき、JDBC接続プールからJDBC接続を再度取得し、該当するアプリケーション・モジュールがアプリケーション・モジュール・プールからチェックアウトされている期間(この場合も、通常は1つのHTTPリクエストの期間)、そのJDBC接続を使用します。アプリケーション・モジュール・インスタンスは、PreparedStatement(現在のHTTPリクエストに対するサービスの提供時に使用された可能性がある)の作成に使用したJDBC接続オブジェクトから自分自身を切断するので、それらのPreparedStatementは次のHTTPリクエストで使用することができません(PreparedStatementは、自身が作成された接続オブジェクトのコンテキスト内でのみ有効であるため)。そのため、今の場合のように接続プーリング・モードを有効にして使用する場合は、データベース接続の総数が少なくなるかわりに、JDBCを毎回セットアップするオーバーヘッドが少し増えます。

アプリケーション接続のために、基礎となる同一のデータベース・ユーザーを多数のアプリケーション・モジュール・プールがすべて使用する場合、違いが顕著になります。

  • 50個の異なるアプリケーション・モジュール・プールがそれぞれアプリケーション・モジュール・インスタンスを内部に1つだけ持つ場合、jbo.doconnectionpooling=falseという条件では、50個のJDBCアプリケーション接続が使用されます。jbo.ampool.minavailablesize=0と設定し、適切なインスタンス・アイドル・タイムアウトが経過した後にアプリケーション・モジュール・プールを0インスタンスまで減らせるようにアプリケーション・モジュール・プーリングのパラメータを設定すると、アプリケーション・モジュールは保持していた接続をそのプールから削除されるときに元に戻します。

  • 対照的に、50個の異なるアプリケーション・モジュール・プールがそれぞれ1つのアプリケーション・モジュール・インスタンスを持ち、jbo.doconnectionpooling=trueであった場合、使用中のJDBC接続の数は、これらのアプリケーション・モジュールのうち、異なるクライアントにより同時に使用されているものの数によって変わります。アプリケーション・モジュール・インスタンスは、プール内にあってユーザー・セッションにより使用されていない場合、jbo.doconnectionpooling=trueという条件があるため、そのJDBC接続を接続プールに解放します。そのアプリケーション・モジュール・インスタンスは、別のユーザーによって再度必要とされるかアプリケーション・モジュール・プール・モニターによって最終的にクリーンアップされるまでプール内で待機している間、JDBC接続には接続されていません。


パフォーマンスに関するヒント:

スケーラビリティと信頼性を犠牲にせず、高パフォーマンスを実現するため、jbo.doconnectionpooling構成パラメータをfalseに設定されたままにしておくことをお薦めします。それでも、データベース接続プーリングは、アプリケーション・モジュール・プーリングを介して実現されます。唯一の例外は、複数のアプリケーション・モジュール・プール(したがって、多数のアプリケーションモジュール・インスタンス)が同一のデータベースを共有する場合で、利用できるデータベース接続の総数を最優先します。


最高のパフォーマンスを得るには、アプリケーション・モジュール・プールにチェックインするたびに、データベース接続からアプリケーション・モジュール・インスタンスを接続しないでください。したがって、jbo.doconnectionpooling構成パラメータのデフォルト設定はfalseです。アプリケーション・モジュール・インスタンスのプーリングは、以前から、リソース使用率の最適化には効果的な方法でした。しかし、プールにリリースするたびに、関連するJDBC接続からアプリケーション・モジュール・インスタンスを切断する必要がない場合には、Oracle ADFランタイムがさらに効率的です。事実上、JDBC接続と1対1の関係を持つアプリケーション・モジュールをプーリングすることで、大半のFusion Webアプリケーションに最適なデータベース接続のプールはできあがっています。

しかし、データベースセッションの総数の最小化が最優先されるとき、アプリケーション・モジュール・プールの数が多く、それらのすべてにおいて基礎となる同一のアプリケーション・ユーザーのデータベース接続をデータベース・レベルで使用する必要がある場合は、データベース接続プーリングの使用が適していることがあります。この場合、多数のアプリケーション・モジュール・プールでは、それぞれ効率のロスはあるものの、JDBC接続の基礎となる同一のデータベース接続プールを共有することにより、データベース・セッションの総数を節約できます。ただし、これが有効なのは、すべてのデータベース・セッションの優先度が最大の場合のみです。このシナリオで、ユーザーがビュー・オブジェクトの行セットの、すべてではないいくつかの行をスクロールする場合に、jbo.doconnectionpooling=trueにすると、Oracle ADFは、アプリケーション・モジュールが次回使用されるときに、問い合せられたビュー・オブジェクトを、同じ最初の行がフェッチされた状態で同じ現在行に戻すことができるように、保留中のアプリケーション・モジュール状態(現在行情報を含む)を自動的に受動化します。この受動化動作はパフォーマンス低下を招くことがあります。

JDBC接続を保持することと、すべてのアプリケーション・モジュールをデータベースに接続したままにすることのバランスをより理想的なものにするには、jbo.ampool.connection_thresholdを構成します。この実行時プロパティでは、結合されたすべてのアプリケーション・モジュール・プール内のアプリケーション・モジュールがチェックイン時に保持する(解放して接続プールに戻さない)最大接続数を指定します。最大接続数を設定するということは、解放時にアプリケーション・モジュールを切断する必要があることを暗に示しているため、jbo.doconnectionpooling=trueが自動的に有効になります。jbo.doconnectionpoolingプロパティの最適化の詳細は、50.3.2項「接続プーリングの最適化に関する必知事項」を参照してください。

50.2.7 アプリケーション・モジュール・プールのパラメータに関する必知事項

アプリケーション・モジュール・プールの構成パラメータは、プールの動作、プールのサイズ指定およびプールのクリーンアップ動作に関連する3つの論理的カテゴリに分類されています。

50.2.7.1 プールの動作に関するパラメータ

アプリケーション・モジュール・プールの動作に影響を与えるアプリケーション・モジュール構成パラメータを表50-1に示します。

表50-1 プールの動作に関するアプリケーション・モジュール構成パラメータ

プール構成パラメータ 説明

管理された解放時にトランザクションの状態をフェイルオーバー

(jbo.dofailover)

フェイルオーバーを無効にするか有効にするかを指定します。デフォルトでは、フェイルオーバーは無効になっています。フェイルオーバーを有効にするには、このパラメータをtrueに設定します。有効な場合、Oracle ADFフレームワークにより、アプリケーション・モジュールが「管理対象状態」モードでプールにリリースされるたびに、保留トランザクション状態の非アクティブ化が可能となります。詳細は、49.2.2.2項「オプションのフェイルオーバー・モードを有効にしたときの受動化の変化」を参照してください。

デフォルトでは、フェイルオーバー機能は無効になっています(jbo.dofailover=false)。これは、構成されているWebサーバー・インスタンスが1つのみのときに、受動化と能動化の必要性を減らすことで、パフォーマンスを最適化するためです。これにより、特定のユーザー・セッションに対するアプリケーション・モジュールのアフィニティが実現されます。

注意: アプリケーション・モジュール状態の受動化を有効にしている場合は、接続を強制的にプールに復帰させるようにOracle WebLogic Serverを構成していると障害が発生することがあります。このタイプの障害によって、SQLException(接続はすでに閉じられている)が生成され、サーバー・ログに保存されます。この例外は、ユーザー・インタフェースからは通知されません。

確実に状態の受動化が発生し、ユーザーの変更内容が保存されるようにするには、weblogic-application.xmlデプロイメント・ディスクリプタの<connection-check-params> pool-params要素にあるパラメータinactive-connection-timeout-secondsに適切な値を設定します。

ほとんどの場合、デプロイメント・ディスクリプタ・パラメータを数分に設定すると、非アクティブ時の接続タイムアウトおよびその結果発生する受動化の失敗の強制が回避されます。ご使用の環境に合せて、この設定値を調整してください。

解放時の行レベル・ロックの動作

(jbo.locking.mode)

ロック・モード(optimisticまたはpessimistic)を指定します。デフォルトはoptimisticで、アプリケーション・モジュールがプールに解放されるたびに、アプリケーション・モジュール・プールが、行レベル・ロックを使用しているデータベース上にトランザクション保留中の状態を作らないように強制します。詳細は、49.11.1項「アプリケーションがオプティミスティック・ロックを使用していることを確認する方法」を参照してください。

Fusion Webアプリケーションでは、ロック・モードをデフォルト値のoptimisticのままにして、行レベル・ロックが作成されることを回避してください。

このパラメータは「構成の編集」ダイアログでは構成できません。jbo.locking.modeパラメータを構成するには、adf-config.xmlファイルの概要エディタの「ビジネス・コンポーネント」ページを開きます。このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」ペインの「ADF META-INF」フォルダにあります。

この機能はデフォルトで有効になっており、optimisticに設定されています。

解放時にアプリケーション・モジュールを切断(接続プーリングを使用)

(jbo.doconnectionpooling)

注意: このパラメータの名前は誤解されやすく、「構成の編集」ダイアログに示される「解放時にアプリケーション・モジュールの切断」という名前の方がよく理解できます。

アプリケーション・モジュール・インスタンスがアプリケーション・モジュール・プールに戻されるときに、そのアプリケーション・モジュール・インスタンスをデータベース接続から切断できるかどうかを指定します。これにより、アプリケーションではアプリケーション・モジュール・プールをデータベース接続プールより大きなサイズに設定できます。デフォルトはfalseで、アプリケーション・モジュール・インスタンスがアプリケーション・モジュール・プールに戻されるときに、そのアプリケーション・モジュール・インスタンスはデータベース接続を維持できます。trueに設定すると、アプリケーション・モジュール・インスタンスがアプリケーション・モジュール・プールに戻されるときに、アプリケーション・モジュールはデータベース接続を解放してデータベース接続プールに戻すことができます。アプリケーション・モジュールがデータベース接続から切断されるまでは、そのデータベース接続に対してロールバックを発行して、保留データベース状態を元に戻すことができますので注意してください。

接続の保持とメモリー内のアプリケーション・モジュールの受動化との最適なバランスを実現するには、jbo.ampool.connection_thresholdも参照してください。詳細は、50.2.6項「データベースとアプリケーション・モジュール・プールの連携に関する必知事項」を参照してください。

この機能はデフォルトでは無効(false)です。

最大接続数のしきい値への到達時にアプリケーション・モジュールを切断

(jbo.ampool.connection_threshold)

結合されたすべてのアプリケーション・モジュール・プールにあるすべてのアプリケーション・モジュールに対するJDBC接続の最大数に到達するまでは、チェックイン時にJDBC接続を解放して接続プールに戻さないように、アプリケーション・モジュールのJDBC接続の保持を強制するかどうかを指定します。この機能はデフォルトで無効になっており(jbo.ampool.connection_threshold=0)、通常の接続プーリングに関連するオーバーヘッドが防止されています。

接続のしきい値を、0より大きな制限値に設定すると、この機能が有効になります。しきい値に達すると、使用可能なアプリケーション・モジュールで最も長い間使用されていないものから開始される次回のプール・クリーンアップ・サイクルで、接続が解放されます。

接続しきい値をゼロ以外の値に設定するということは、解放時にアプリケーション・モジュールを切断する必要があることを暗に示しているため、jbo.doconnectionpooling=trueが自動的に有効になります。詳細は、50.3.2項「接続プーリングの最適化に関する必知事項」を参照してください。

接続しきい値にゼロ以外の値を設定すると、アプリケーション・モジュールのチェックイン時ではなく、アプリケーション・モジュール・プールのクリーンアップ時にJDBC接続が解放されます。JDBC接続が効率的に解放されるようにするには、モニターのスリープ時間を短縮するようにjbo.ampool.monitorsleepintervalを構成します。

この機能はデフォルトで無効になっています(jbo.ampool.connection_threshold=0)。

リリース時のトランザクション・メモリーの状態

(jbo.txn.disconnect_level)

アプリケーション・モジュール、ビュー・オブジェクトおよび行セットがすべてメモリーに残り、有効なままになるものの、これらに対応するJDBCオブジェクトへの参照はドロップされるようにするかどうかを指定します。メモリー内の受動化はデフォルトで有効になっています(jbo.txn.disconnect_level=1)。能動化にあたり、このフレームワークがカーソル位置を再実行し、同期します。

jbo.doconnectionpooling=trueまたはjbo.ampool.connection_thresholdと組み合せて使用すると、パフォーマンスが向上し、この状況に関連するメモリーのオーバーヘッドが軽減されます。詳細は、50.3.2項「接続プーリングの最適化に関する必知事項」を参照してください。

jbo.txn.disconnect_level=0に設定すると、アプリケーション・モジュールを受動化するときの動作が変更され、ビュー・オブジェクトとその行セットが閉じられ、削除されるようになります。この場合、アクティブ化されるときに、ビュー・オブジェクトとその行セットが再作成され、元の状態に戻されます。jbo.txn.disconnect_level1に設定すると、この動作は行われず、前述の状況で受動化のコストが発生することはありません。

この機能はデフォルトで有効になっています(jbo.txn.disconnect_level=1)。

アプリケーション・モジュール・プーリングを使用可能にする

(jbo.ampool.doampooling)

アプリケーション・モジュール・プーリングを有効にするかどうかを指定します。デフォルトでは、アプリケーション・プーリングは有効(true)になっています。

本番環境でアプリケーションをデプロイする場合は、常にjbo.ampool.doampoolingをデフォルトのtrueに設定してアプリケーションを実行します。ただし、テスト環境でアプリケーションを実行するかぎり、テストでは、このプロパティをfalseに設定することで重要な役割を果せます。このプロパティがfalseの場合、実質的にアプリケーション・プールはありません。詳細は、49.10項「アプリケーション・モジュールの能動化が安全であることの確認テスト」を参照してください。

この機能はデフォルトでは有効(true)です。

動的JDBC資格証明をサポート

(jbo.ampool.dynamicjdbccredentials)

該当するアプリケーション・モジュールの使用を新しいユーザー・セッションが開始するたびに、データベース資格証明(ユーザー名/パスワード)の変更を開発者作成コードに許可する別のプーリング・ライフサイクル・イベントを有効にするかどうかを指定します。

この機能はデフォルトで有効化(true)されていますが、この機能を実装するには、この設定は必要ではありますが、十分ではない条件です。機能を実装するための十分な条件が必要で、追加の開発者作成のコードが必要となります。

管理されていない解放時に非トランザクション状態をリセット

(jbo.ampool.resetnontransactionalstate))

アプリケーション・モジュールが非管理モード、すなわち「ステートレス」モードでプールに解放されたときに、ビュー・オブジェクトの実行時設定、JDBCプリコンパイル文、バインド変数値のような非トランザクション状態をすべてリセットするかどうかを指定します。デフォルトでは、アプリケーション・モジュールのリセットは有効(true)になっています。

この機能を無効化すると、パフォーマンスが向上しますが、バインド変数値がクリアされないため、ユーザーのアプリケーションでバインド変数値を正確に設定する必要があります。この機能を無効化して、ユーザーのバインド変数値のデータを別のユーザーが参照していると、障害が発生します。

この機能はデフォルトでは有効(true)です。


50.2.7.2 プールのサイズ指定に関するパラメータ

アプリケーション・モジュール・プールのサイズ指定に影響を与えるアプリケーション・モジュール構成パラメータを、表50-2に示します。

表50-2 プールのサイズ指定に関するアプリケーション・モジュール構成パラメータ

プール構成パラメータ 説明

プールの初期サイズ

(jbo.ampool.initpoolsize)

プールの初期化時に作成されるアプリケーション・モジュール・インスタンスの数を指定します。デフォルト値は、0(ゼロ)です。

追加のアプリケーション・モジュール・インスタンスが必要になったときにオンデマンドで作成するのでなく、初期化時にアプリケーション・モジュール・インスタンスを作成することで、CPU処理コストが削減されます。

一般的なガイドラインは、すべてのユーザーにサービスを提供するために必要な同時アプリケーション・モジュール・インスタンス数の予想値より、10%大きな値に構成することです。

jbo.initpoolsizeを構成するときには、以前に初期化されたアプリケーション・モジュール・インスタンスで、使用されていないものや、jbo.ampool.maxinactiveageによって指定されている制限を超えているものが、プールから解放されることに注意してください。jbo.ampool.minavailablesizeを使用してこのパラメータを調整し、初期化済のインスタンスが解放されないようにします。

最大プール・サイズ

(jbo.ampool.maxpoolsize)

プールが割り当てるアプリケーション・モジュール・インスタンスの最大数を指定します。プールでは、この限界値を超える数のアプリケーション・モジュール・インスタンスを作成しません。デフォルト値は、4096(インスタンス)です。

参照プール・サイズ

(jbo.recyclethreshold)

状態管理モードでアプリケーション・モジュール・インスタンスをプールに解放する直前にそれらのアプリケーション・モジュール・インスタンスを使用していたセッションによる次のリクエストのためにセッション・アフィニティを維持しようとする、プール内のアプリケーション・モジュール・インスタンスの最大数を指定します。ユーザー・セッション・アフィニティのメカニズムでは、ユーザー・セッションが最後のリクエストで使用していたプールから、同じアプリケーション・モジュール・インスタンスを戻そうとします。アプリケーション・モジュール・プールが通常のアプリケーション・ロードに対して正しくサイズ設定されていれば、ほとんどの場合、ユーザー・セッションはそれが使用したアプリケーション・モジュール・インスタンスと再統合されます。

デフォルトでは10個のインスタンスが、状態管理モードでそれらのインスタンスを解放した直近のセッションとのアフィニティに従うことができます。このパラメータ値は常に、「最大プール・サイズ」の値以下である必要があります。

この値は、ユーザーのセッションへのアプリケーション・モジュール・インスタンスのアフィニティを維持するように構成します。一般的なガイドラインは、短い思考時間で複数の操作を行う同時ユーザー数の予想値に構成することです。短い思考時間でアプリケーションを使用すると予想されるユーザーがいない場合、これを0(ゼロ)に構成してアフィニティを除去できます。

このアフィニティを可能なかぎり大きく構成すると、ユーザー・セッションからユーザー・セッションにアプリケーション・モジュール・インスタンスを切り替える必要がなくなるため、CPU処理コストを節減できます。


50.2.7.3 プールのクリーンアップに関するパラメータ

Java VMごとに1つのアプリケーション・モジュール・プール・モニターがバックグラウンド・スレッドで動作し、しばしばウェイクアップしてリソースの再生を実行します。プール・モニターは次の2つの独立した戦略を使用して、どのアプリケーション・モジュール・インスタンスをプールから削除し、使用可能な新しいリソースとして解放可能かを判断します。

  1. アプリケーション・モジュール・プール・モニターは、3600000ミリ秒(1時間、デフォルト値)を超える期間使用されていなかったアプリケーション・モジュール・インスタンスをプールから削除します。これらの未使用のアプリケーション・モジュール・インスタンスは、プールの使用可能な最小サイズにかかわらず解放されます。アプリケーション・モジュールに対する最長有効期間をオーバーライドするには、jbo.ampool.timetoliveパラメータを設定できます。ただし、ほとんどのFusion Webアプリケーションでは未使用のアプリケーション・モジュール・インスタンスを解放する必要はないため、このパラメータ値を-1に設定できます。

  2. アプリケーション・モジュール・プール・モニターは、600000ミリ秒(10分、デフォルト値)を超える期間アイドル状態であったアプリケーション・モジュール・インスタンスをプールから削除します。このクリーンアップは、プール内のインスタンス数が、使用可能な最小サイズに達すると停止します。jbo.ampool.maxinactiveageパラメータを使用することにより、アプリケーション・モジュール・インスタンスに対するアイドル・タイムアウトをオーバーライドできます。

プール・モニターが各リソース・クリーンアップ・パスを実行するときのリソースの再生処理に影響を与えるパラメータを、表50-3に示します。


ベスト・プラクティス:

アプリケーション・モジュール・プールのクリーンアップ・パスの時間間隔を指定するときに、すべてのアプリケーション・モジュールで同一のプール・ポーリング間隔の値を使用するよう設定するのがベスト・プラクティスです。Java VM 1つにつきアプリケーション・モニターのプール・モニターは1つしかありませんので、アプリケーション・モジュール・プール・モニターのポーリング間隔として効果的に使用される値は、アプリケーション・モジュール構成内にあり、作成される最初のアプリケーション・モジュール・プールにより読取られる値です。すべてのアプリケーション・モジュールで同じ値が使用されるように設定すると、この値が予想可能な方法で確実に設定されます。


表50-3 リソースの管理に関するアプリケーション・モジュール構成パラメータ

プール構成パラメータ 説明

プール・ポーリング間隔

(jbo.ampool.monitorsleepinterval)

プールのリソース・クリーンアップの間隔(ミリ秒)を指定します。間隔を長くすると、リソース・クリーンアップの頻度が低くなります。

アプリケーション・モジュール・プール・モニターは、デフォルトでは600000ミリ秒(600秒または10分)ごとにウェイクアップします。短い間隔を構成すると、アクティブでないアプリケーション・モジュール・インスタンスを、メモリーを節約するために削除する頻度が高くなります。

プール内のアプリケーション・モジュール・インスタンスの数が最大プール・サイズを超えないかぎり、プールから削除される候補のインスタンスは、アプリケーション・モジュール・プール・モニターが次回ウェイクアップしてそのジョブを実行するまで、クリーンアップされることはありません。

使用可能な最大サイズ

(jbo.ampool.maxavailablesize)

サーバーに負荷がかかっている場合にプール内で利用可能なアプリケーション・モジュール・インスタンスの理想的な最大数を指定します。

デフォルト値は、25(インスタンス)です。一般に、値を低くすると、クリーンアップの際にプールから削除されるアプリケーション・モジュール・インスタンスの数が増えます。リソース・クリーンアップ後に利用可能にしておきたいインスタンス数の最大数に構成します。

一般的なガイドラインは、通常の負荷のときのプール・サイズより20%大きく構成し、後から必要になる拡張に備えることです。低すぎる値に設定すると、利用できるアプリケーション・モジュール・インスタンスがない場合にアプリケーションにアクセスした一部のユーザーに対してエラーが発生します。

プール・モニターは、ウェイクアップしてリソース・クリーンアップを実行する際に、使用可能なアプリケーション・モジュール・インスタンスを削除して、使用可能なインスタンスの総数をこの理想的な最大値まで減らそうとします。アイドル・インスタンス・タイムアウトより長い間使用されていないインスタンスは、この時点でクリーンアップされ、このサイズまで使用可能なインスタンス数を下げる必要がある場合は、追加の使用可能なインスタンスが削除されます。

アプリケーション・モジュール・プール・チューニングは、jbo.ampool.maxavailablesize | jbo.ampool.minavailablesizeパラメータに対して異なる値を許容しますが、多くの場合、最小と最大のチューニング・プロパティを同じ値に設定して問題ありません。

使用可能な最小サイズ

(jbo.ampool.minavailablesize)

サーバーの負荷が低い場合に、リソースのクリーンアップ処理時にプール・モニターがプールに残す必要のある、利用可能なアプリケーション・モジュール・インスタンスの最小数を指定します。

デフォルト値は、5(インスタンス)です。

リソースのクリーンアップ後にすべてのインスタンスがアイドル・タイムアウトより長い期間アイドルである場合に、プールにインスタンスが1つも含まれないようにするには、0(ゼロ)を設定します。

アプリケーション・モジュール・プールのチューニングではjbo.ampool.minavailablesizejbo.ampool.maxavailablesizeパラメータに対して異なる値を指定できますが、ほとんどの場合、これらの最小および最大チューニング・パラメータには同じ値を設定しても問題ありません。

アイドル・インスタンス・タイムアウト

(jbo.ampool.maxinactiveage)

それを超えると、プール内のアイドル状態のアプリケーション・モジュール・インスタンスが次回のリソース・クリーンアップ時に削除の候補とみなされる時間(ミリ秒)を指定します。

デフォルト値は、600000ミリ秒(600秒または10分)です。値を低くすると、次回のクリーンアップで削除する候補としてマークされるアプリケーション・モジュール・インスタンスの数が増えます。値を高くすると、次回のクリーンアップで削除する候補としてマークされるアプリケーション・モジュール・インスタンスの数が減ります。

インスタンスの最大有効時間

(jbo.ampool.timetolive)

それを超えると、プール内のインスタンス数がminavailablesize未満になるかどうかには関係なく、プール内の未使用のアプリケーション・モジュール・インスタンスが次のリソース・クリーンアップ時に削除の候補とみなされる時間(ミリ秒)を指定します。

デフォルト値は3600000ミリ秒(3600秒または1時間)です。値を低くすると、次回のリソース・クリーンアップで削除されるまでに未使用のアプリケーション・モジュール・インスタンスが存在できる時間が短くなります。大部分のアプリケーションには、デフォルト値で十分です。値を高くすると、次回のクリーンアップで削除されるまでにアプリケーション・モジュール・インスタンスが存在できる時間が長くなります。

または、アプリケーション・モジュール・プール・モニターによって未使用のアプリケーションが削除されないようにするには、パラメータ値を-1に設定します。


50.2.8 データソース構成に関する必知事項

アプリケーション・モジュールの接続タイプとしてJDBCデータソースを指定すると、データベース接続プールのために設定されている構成パラメータはすべて無視されます。データソース用に接続プールを構成するには、使用しているJava EEコンテナの提供する方法を使用する必要があります。Oracle WebLogic Serverの場合、Oracle WebLogic Server管理コンソールを使用してデータソースを構成します。

JDBCデータ・ソースを構成する主な手順は次のとおりです。

  1. 接続先となる各データベースのデータ・ソースを作成します。データソースを作成するときには、表50-4で説明されているADFビジネス・コンポーネント・データベース接続プールの構成オプションと一致する構成オプションを指定します。ここで指定する構成設定は、使用しているデータベース、およびアプリケーションに見込んでおく必要のある容量計画に依存します。

    JDBCデータソースの構成および接続プールの容量計画立案の詳細は、『Oracle WebLogic Server JDBCデータ・ソースの管理』を参照してください。

  2. 必要に応じて、データソースのトランザクション・オプションを構成します。

  3. 必要に応じて、データソースの接続テスト・オプションを構成します。

  4. 必要に応じて、データソースを追加のサーバーおよびクラスタにターゲット指定します。

これらの手順の詳細は、管理コンソール・オンライン・ヘルプにあるJDBCデータソースの構成に関するトピックを参照してください。

表50-4 同等のOracle WebLogic Serverデータソース・パラメータ

ADFビジネス・コンポーネント・パラメータ Oracle WebLogic Serverパラメータ

プールの初期サイズ

(jbo.initpoolsize)

初期容量

最大プール・サイズ

(jbo.maxpoolsize)

最大容量

プール・ポーリング間隔

(jbo.poolmonitorsleepinterval)

Oracle WebLogic Serverには、同等なものがありません。

使用可能な最大サイズ

(jbo.poolmaxavailablesize)

最大容量

使用可能な最小サイズ

(jbo.poolminavailablesize)

最大容量

アイドル・インスタンス・タイムアウト

(jbo.poolmaxinactiveage)

縮小間隔


50.2.9 データベース接続プールのパラメータに関する必知事項

接続情報としてJDBC URLを使用しADFデータベース接続プールを使用する場合は、表50-5の構成パラメータを使用すると、データベース接続プールの動作をチューニングできます。Java VMごとに1つのデータベース接続プール・モニターがバックグラウンド・スレッドで動作し、しばしばウェイクアップしてリソースの再生を実行します。プール・モニターが各リソース・クリーンアップ・パスを実行するときのリソースの再生処理に影響を与えるパラメータを、表50-3に示します。


注意:

データベース接続プーリング用の構成パラメータは、MetaObjectManagerスコープを持ちます(前述の50.2.5項「構成プロパティのスコープに関する必知事項」を参照)。つまり、それらの設定値はグローバルで、アプリケーション内で最初のアプリケーション・モジュール・プールが作成されるときに設定されます。最も予想可能な動作が確実に行われるようにするには、「プーリングおよびスケーラビリティ」タブの「接続プール」セクションにあるこれらのパラメータの値をデフォルト値のままにしておきます。こうしておくと、これらのパラメータについて、bc4j.xcfgファイルには何も書き込まれません。そのかわりに、Java EEコンテナのJavaシステム・パラメータとして、データベース接続プールのチューニング・パラメータに必要な値を設定します。


表50-5 データベース接続プールのパラメータ

プール構成パラメータ 説明

プールの初期サイズ

(jbo.initpoolsize)

プールの初期化時に作成されるJDBC接続インスタンスの数を指定します。

デフォルト値は0(インスタンス)です。

最大プール・サイズ

(jbo.maxpoolsize)

プールで割り当てることができるJDBC接続インスタンスの最大数を指定します。

この限界値を超える数のJDBC接続がプールによって作成されることはありません。デフォルト値は、4096(インスタンス)です。

各接続リクエストはjbo.poolrequesttimeoutの設定値まで待機し、接続が使用可能にならなかった場合は、「JBO-28102: リソース・プールに戻るはずのリソースを待機中に、リクエストがタイムアウトしました: null。」と表示されます。

プール・ポーリング間隔

(jbo.poolmonitorsleepinterval)

プールのリソース・クリーンアップの間隔(ミリ秒)を指定します。

デフォルト値は、600000ミリ秒(600秒または10分)です。短い間隔を構成すると、アクティブでない接続インスタンスを、メモリーを節約するために削除する頻度が高くなります。間隔を長くすると、リソース・クリーンアップの頻度が低くなります。

プール内のJDBC接続インスタンスの数が最大プール・サイズを超えないかぎり、プールから削除される候補のインスタンスは、JDBC接続プール・モニターが次回ウェイクアップしてそのジョブを実行するまで、クリーンアップされることはありません。

使用可能な最大サイズ

(jbo.poolmaxavailablesize)

サーバーに負荷がかかっている場合の、プール内のJDBC接続インスタンスの理想的な最大数を指定します。

デフォルトの最大使用可能サイズは25インスタンスです(ロードが発生していない場合)。

リソースのクリーンアップを実行するためにプールの監視が起動すると、使用可能なJDBC接続インスタンスを削除して、この理想の最大数にまで使用可能なインスタンスの数を下げようと試行されます。アイドル・インスタンス・タイムアウトより長い間使用されていないインスタンスは、この時点でクリーンアップされ、このサイズまで使用可能なインスタンス数を下げる必要がある場合は、追加の使用可能なインスタンスが削除されます。

使用可能な最小サイズ

(jbo.poolminavailablesize)

サーバーの負荷が低い場合に、リソースのクリーンアップ処理時にプール・モニターがプールに残す必要のある、利用可能なJDBC接続インスタンスの最小数を指定します。

デフォルトでは、利用可能な最小サイズを5(インスタンス)未満にしません。

すべてのインスタンスがアイドル・タイムアウトより長い期間アイドルである場合に、プールにインスタンスが1つも含まれないようにするには、ゼロ(0)を設定します。

アイドル・インスタンス・タイムアウト

(jbo.poolmaxinactiveage)

それを超えると、プール内の非アクティブなJDBC接続インスタンスが次回のリソース・クリーンアップ時に削除の候補とみなされる時間(秒)を指定します。

デフォルト値は、600000ミリ秒(600秒または10分)です。

リクエスト・タイムアウト

(jbo.poolrequesttimeout)

プール内のJDBC接続インスタンスを待機する時間(秒)を指定します。この時間を越えると、次のように表示されます。ADF: 次のJSFエラー・メッセージを追加します: リソース・プールに戻るはずのリソースを待機中に、リクエストがタイムアウトしました: null。

想定される負荷に応じてこのパラメータを構成します。負荷に対して低く設定しすぎると、サーバーが応答の機会を逃す可能性があります。高く設定しすぎると、ユーザー側から見てアプリケーションがタイムアウトまでハングした状態になります。

デフォルト値は、30000ミリ秒(30秒)です。


ただし、データベース接続プールはセッション・アフィニティのヒューリスティックを実装しないため、このデータベース接続プールについて、参照されるプール・サイズを制御する構成パラメータはありませんので注意してください。

50.3 データベースの状態の初期化とプーリングに関する考慮事項

現在のユーザー・セッションに関連するデータベース状態を初期化するために、ストアド・プロシージャの起動が必要な場合もあります。その初期化を実行するには、アプリケーション・モジュールのprepareSession()メソッドをオーバーライドして行うのが正しい方法です。

50.3.1 ユーザー単位でのデータベース状態の設定方法

Fusion Webアプリケーションでは、ユーザーごとにデータベース状態を設定できます。通常は、データベースCONTEXTネームスペースを作成し、PL/SQLプロシージャをそれに関連付け、SYS_CONTEXT() SQL関数を使用してコンテキストから値を参照します。

たとえば、例50-4に示すように、PL/SQLパッケージを使用して、現在認証されているFusion Webアプリケーション・ユーザーの名前を保持する変数をパッケージ・レベルで設定および取得できます。

例50-4 CONTEXT_PKG PL/SQLパッケージ

create or replace package context_pkg as
  procedure set_app_user_name(username varchar2);
  function app_user_name return varchar2;
end context_pkg;

その後、このアプリケーションはビュー・オブジェクトのWHERE句を定義し、context_pkg.app_user_name関数を参照して、ユーザーごとに状態を問い合せることができます。

データベース状態を設定するために、アプリケーション・モジュール・フレームワーク拡張クラス(AppModuleImpl.java)は、16.5.2項「IN引数のみのストアド・プロシージャの呼出し方法」で説明されているものによく似たcallStoredProcedure()ヘルパー・メソッドを定義します。その後、このカスタム・アプリケーション・モジュール・クラスはこのフレームワーク拡張クラスをさらに拡張して、例50-5に示すようなsetCurrentUserInPLSQLPackage()ヘルパー・メソッドを定義します。このヘルパー・メソッドはcallStoredProcedure()メソッドを使用して、context_pkg.set_app_user_name()ストアド・プロシージャを呼び出し、パラメータ値として、現在認証されているユーザーの値を渡します。

例50-5 ストアド・プロシージャContext_Pkg.Set_App_User_Nameをコールするメソッド

// In CustomAppModuleImpl.java
public void setCurrentUserInPLSQLPackage() {
  String user = getUserPrincipalName();
  callStoredProcedure("context_pkg.set_app_user_name(?)",new Object[]{user});
}

このヘルパー・メソッドを使用し、カスタム・アプリケーション・モジュール・クラスは例50-6に示すように、prepareSession()メソッドをオーバーライドします。

例50-6 afterConnect()およびprepareSession()のオーバーライドによるデータベース状態の設定

// In CustomAppModuleImpl.java
  protected void prepareSession(Session session) {
    super.prepareSession(session);
    getLoggedInUser().retrieveUserInfoForAuthenticatedUser();     
    setUserIdIntoUserDataHashtable();
    setCurrentUserInPLSQLPackage();      
  }

50.3.2 接続プーリングの最適化に関する必知事項

jbo.doconnectionpoolingのデフォルト設定はfalseです。これはアプリケーション・モジュール・インスタンスがJDBC接続をしっかりと捕捉しながら、アプリケーション・モジュール・プール内に存在することを意味します。この設定では、アプリケーション・モジュールはJDBCのプリコンパイル済SQL文をアプリケーション・モジュールのチェックアウト/チェックインの間、オープンのままにしておけるため、最も効果的です。アプリケーション・モジュール・インスタンスは、新しいユーザー・セッションがprepareSession()メソッドを使用し始めるたびに、このメソッドをトリガーします。

jbo.doconnectionpoolingtrueに設定すると、アプリケーション・モジュールがプールからチェックアウトされるたびに、アプリケーション・モジュール・プールはデータベース接続プールからJDBC接続を取得し、現在のリクエストの期間中、それを使用します。該当リクエストの終了時、アプリケーション・モジュールがアプリケーション・モジュール・プールに解放されるとき、アプリケーション・モジュール・プールは使用していたJDBC接続をデータベース接続プールに解放します。

jbo.doconnectionpoolingtrueに設定されているので、プール内のアプリケーション・モジュール・インスタンスはその後、プールからチェックアウトされるたびにまったく異なるJDBC接続を持つ可能性があります。この場合は、該当するアプリケーション・モジュールがプールからチェックアウトされるたびにprepareSession()メソッドが起動され、ユーザーはデータベース状態を初期化しなおすことができます。

jbo.doconnectionpoolingtrueに設定すると、jbo.txn.disconnect_levelのデフォルト設定により、対応するJDBCオブジェクトへの参照がドロップされた後でも、アプリケーション・モジュール、ビュー・オブジェクトおよび行セットをすべてメモリーに残し、有効のままにできます。この構成により、通常は解放時にアプリケーション・モジュールの受動化が実行される、この状況に関連するメモリーのオーバーヘッドが軽減されます。かわりに、アクティブ化されるときに、このフレームワークがカーソル位置を再実行し、同期します。

JDBC接続を保持することと、すべてのアプリケーション・モジュールをデータベースに接続したままにすることの最適なバランスを実現するために、jbo.ampool.connection_thresholdを構成できます。このプロパティでは、結合されたすべてのアプリケーション・モジュール・プール内のアプリケーション・モジュールがチェックイン時に保持する(解放して接続プールに戻さない)最大接続数を指定します。しきい値にゼロより大きい制限値を設定すると、クリーンアップ・モニターは強制的に、アプリケーション・モジュールのチェックイン時ではなく、アプリケーション・モジュール・プールのクリーンアップ時にJDBC接続を解放します。

これはアプリケーション・モジュール接続のしきい値を有効にした場合の重要な相違点で、アプリケーション・モジュールは、チェックイン時ではなく、プールのクリーンアップ時に切断されます。クリーンアップ・モニターは、JDBC接続数の合計が指定のしきい値を下回るまでにアプリケーション・モジュールを切断しようと最善の努力をします。ただし、十分な数のアプリケーション・モジュールが使用可能な状態にない場合、これは可能ではありません。JDBC接続が効率的に解放されるようにするために、jbo.ampool.monitorsleepintervalを構成してモニターのスリープ時間を短縮できます。

jbo.ampool.connection_threshold構成プロパティはJDeveloperプロパティ・エディタによって公開されるものではなく、厳密にOracle WebLogic ServerのJavaオプションとして実行時に構成されるように意図されています。たとえば、デプロイメント環境において、システム管理者は、Oracle WebLogic Serverの起動スクリプト(setWLSEnv.cmdなど)を使用して、プロパティを-Djbo.ampool.connection_threshold=制限として定義することがあります。

JDeveloperでアプリケーションをテストするときには、プロパティをJVMシステム・プロパティとして指定できます。たとえば、図50-2に示すように、「実行構成の編集」ダイアログを使用して、JVMに対するJDeveloperの起動設定を指定します。JDeveloperで、「プロジェクト・プロパティ」ダイアログの「実行/デバッグ」ページから、「実行構成の編集」ダイアログを開きます。

図50-2 アプリケーション・モジュールのしきい値をJDeveloperの起動設定として指定

アプリケーション・モジュールの接続しきい値の起動設定

50.4 デプロイメント環境のシナリオとプーリング

アプリケーションが利用するプールの数やプールの型は、ターゲット・プラットフォームの構成によって異なります。たとえば、アプリケーション・ユーザーのWebリクエストにサービスを提供するために利用できるJava仮想マシン(JVM)が複数あるかどうかや、Oracle WebLogic Serverドメインが複数あるかどうかで変わります。このアプリケーションにおいて、実行時のJVMが1つのシナリオと複数のシナリオで、どの種類のプールがいくつ作成されるのかを理解するために、次の想定を見直してみます。

50.4.1 Oracle WebLogic Serverドメインが1つ、Oracle WebLogic Serverインスタンスが1つ、JVMが1つの場合

Oracle WebLogic Serverインスタンスが1つという構成で、このアプリケーションを単一のOracle WebLogic Serverドメインにデプロイすると、アプリケーション・ユーザーからのWebリクエストにサービスを提供する場合に利用可能なJava VMは1つのみになります。

HRModuleおよびPayablesModuleにアクセスするWebページを全ユーザーが利用するものと仮定すると、次のようになります。

  • HRModuleルート・アプリケーション・モジュール用のアプリケーション・モジュール・プールは1つ

  • PayablesModuleルート・アプリケーション・モジュール用のアプリケーション・モジュール・プールは1つ

  • appuser接続用のDB接続プールは1つ

  • 状態管理を目的とする内部接続用JDBC URLのDB接続プールは1つ

Java VMが1つであるこの場合は、全部でアプリケーション・モジュール・プールが2つとデータベース・プールが2つになります。


注意:

再利用可能なCommonLOVModuleのネストされたインスタンスに対して、アプリケーション・モジュール・プールは存在しません。CommonLOVModuleのインスタンスは、HRModuleおよびPayablesModuleのインスタンスにより、それぞれのアプリケーション・モジュール・プール内でラップされます。


50.4.2 Oracle WebLogic Serverドメインが複数、Oracle WebLogic Serverインスタンスが複数、JVMが複数の場合

次は、Java VMが複数関与するデプロイ環境を考えてみます。フロントエンドとしてハードウェア・ロードバランサを設け、4台の異なる物理マシンを2つのOracle WebLogic Serverドメインとして構成してあるものとします。4台のマシン上で、各Oracle WebLogic Serverインスタンスがそれぞれ1つのJVMを持ちます。アプリケーションのユーザーがアプリケーションにアクセスすると、そのリクエストはこれら2つのOracle WebLogic Serverドメインによって共有され、各ドメインの中では該当するOracle WebLogic Serverインスタンスから利用可能な2つのJVMによって共有されます。

この場合も、HRModuleおよびPayablesModuleにアクセスするWebページを全ユーザーが利用するものと仮定すると、次のようになります。

  • HRModuleのアプリケーション・モジュール・プールは4つ(4つの各JVMごとに1つ)

    (1つのHRModuleルート・アプリケーション・モジュール)×(2つのOracle WebLogic Serverドメイン)×(各2つのOracle WebLogic Server JVM)

  • PayablesModuleのアプリケーション・モジュール・プールは4つ(4つの各JVMごとに1つ)

    (1つのPayablesModuleルート・アプリケーション・モジュール)×(2つのOracle WebLogic Serverドメイン)×(各2つのOracle WebLogic Server JVM)

  • appuserのDB接続プールは4つ(4つの各JVMごとに1つ)

    (1つのappuserDB接続プール)×(2つのOracle WebLogic Serverドメイン)×(各2つのOracle WebLogic Server JVM)

  • 内部接続JDBC URLのDB接続プールは4つ(4つの各JVMごとに1つ)

    (1つの内部接続JDBC URLのDB接続プール)×(2つのOracle WebLogic Serverドメイン)×(各2つのOracle WebLogic Server JVM)

この場合は、全部で8つのアプリケーション・モジュール・プールと8つのDB接続プールが4つのJVMに存在することになります。

50.2.7項「アプリケーション・モジュール・プールのパラメータに関する必知事項」でアプリケーション・モジュール・プールの構成パラメータをいろいろと確認する場合、それらのパラメータは1つのJVM内で指定した単一のアプリケーション・モジュールの特定の1つのアプリケーション・モジュール・プールに適用されることに注意してください。

ロード・バランシングによりユーザー・リクエストはOracle ADFが実行されている複数のJVMに分散されるため、各JVMにある個々のアプリケーション・モジュール・プールは、ユーザー負荷のn分の1をサポートする必要があります。ここで、nには、ユーザー・リクエストへのサービス提供に使用できるJVMの数です。アプリケーション・モジュール・プールおよびDB接続プールに適した値は、Java VMの数を念頭に置いて設定する必要があります。基本的には、負荷テストとアプリケーション・モジュール・プーリング統計の結果をサイズに関するパラメータの基準とし、次にその合計をプール数nで割ります。この数は、アプリケーション・サーバー・ドメインとOracle WebLogic Serverインスタンスの使用状況に基づいて決定されます。たとえば、1つのプールにあるアプリケーション・モジュール数の最小値を10に設定しようと決めたが、このアプリケーションにサービスを提供しているOracle WebLogic Serverインスタンスが5つあるため最終的なプール数は5になったという場合、このパラメータは10 (1つのJVMにある指定されたアプリケーション・モジュールのみにサービスを提供)ではなく2 (10を5で割った商)に設定します。使用可能なサイズ指定に関するパラメータの詳細は、表50-2表50-5を参照してください。