Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1.3.0) E90376-03 |
|
前 |
次 |
この章の内容は次のとおりです。
ADFアプリケーション・モジュール・プールとは、複数のアプリケーション・クライアントによって共有される単一のアプリケーション・モジュール・タイプのインスタンスの集合です。Webページの送信間の時間をあけると、より少数のアプリケーション・モジュール・コンポーネントでより多数のアクティブ・ユーザーを処理できます。この場合、メモリー使用量が減少し、パフォーマンスが向上します。
アプリケーション・モジュール・プールは、同じタイプのアプリケーション・モジュール・ランタイム・インスタンスのコレクションです。そこにアクセスするユーザー数をプロビジョニングするために、実行時に1つ以上のアプリケーション・モジュール・インスタンスをプールからサービス・ユーザーに提供するように、Fusion Webアプリケーションを構成できます。
プール内の各アプリケーション・モジュール・インスタンスは、複数のブラウザ・クライアントで共有されます。これらのクライアントの標準的な「思考時間」(Webページを送信する間隔)により、アプリケーション・モジュール・コンポーネントの数がシステムで作業しているアクティブ・ユーザーの総数よりも効果的に小さくなるように最適化されます。たとえば、20人のユーザーがそれぞれのブラウザからWebサイトにアクセスしている場合、これらのユーザーと同数のアプリケーション・モジュール・インスタンスではなく、5個または10個のアプリケーション・モジュール・インスタンスでサービスを提供できる可能性があります。つまり、プールは使用可能なアプリケーション・モジュールの数を上回るユーザーにサービスを提供できるだけでなく、この小さなアプリケーション・モジュールのセットへのサービス提供のために中間層が必要とするメモリーが少なくて済むので、ADFアプリケーションを、制限のあるハードウェア・リソース上でさらに拡大可能になります。
設計時の構成を通して、アプリケーション・モジュールを使用すると、完全にステートレスなFusion Webアプリケーションをサポートしたり、複数のブラウザ・ページにまたがる作業ユニットをサポートしたりできます。パフォーマンスを最適化するために、あるアプリケーション・モジュールのインスタンスが「状態管理」モードでプールに返された場合、プールは該当するアプリケーション・モジュールに対するセッション参照を追跡します。このアプリケーション・モジュールのインスタンスはそのままプールに残り、使用できる状態ですが、「セッション・アフィニティ」を維持することによりパフォーマンスが向上するため、前回このインスタンスを使用していたセッションによる使用が望ましいでしょう。
そのため、プール内のアプリケーション・モジュールのインスタンスはどの時点においても、その状態を反映して、次の3つのグループに論理的に分類されます。
プールにチェックインされて、無条件に使用可能
プールにチェックインされて使用可能だが、アクティブ・ユーザー・セッションによるセッション・アフィニティの再利用のため参照される
プールからチェックアウトされ、かつ使用不可能。Webコンテナ内のなんらかのスレッドにより現在(まさにその瞬間に)使用されているため
アプリケーション・モジュール・プーリングを最大限に活用するには、背後で行われていることを理解しておく必要があります。アプリケーション・モジュールのセッション状態管理の詳細は、「受動化とアクティブ化が行われるタイミングの管理」を参照してください。
アプリケーション・モジュール・プールの動作に影響を与えるために設計時に設定できる構成パラメータの詳細は、「アプリケーション・モジュール・プールの構成パラメータに関する必知事項」を参照してください。
アプリケーション・モジュール・コンポーネントは実行時、次の2つの方法で使用できます。
クライアントから直接アクセスされるアプリケーション・モジュールとして使用する
別のアプリケーション・モジュール・インスタンスの中に集約(ネスト)されている再利用可能なコンポーネントとして使用する
クライアントがこれに直接アクセスするときのアプリケーション・モジュールはルート・アプリケーション・モジュールと呼ばれます。クライアントは、クライアントが含むアプリケーション・モジュール・インスタンスの一部として、ネストされているアプリケーション・モジュールに間接的にアクセスします。同一のアプリケーション・モジュールを実行時にこれら両方の方法で使用することも可能ですが、それは一般的ではありません。重要な点は、ADFビジネス・コンポーネントが作成するのは、ルート・アプリケーション・モジュールに対するアプリケーション・モジュール・プールのみであるということです。
基本的には、各Java VMのFusion Webアプリケーションにより使用されるルート・アプリケーション・モジュール1つにつき、アプリケーション・モジュール・プールが1つ作成されます。これらのJava VMでは、そのタイプのルート・アプリケーション・モジュールがADFコントローラ・レイヤーにより使用されます。アプリケーションが必要とするアプリケーション・モジュール・プールの数に関連する詳細トピックは、「デプロイメント環境のシナリオとプーリング」を参照してください。
アプリケーションが利用するプールの数やプールの型は、ターゲット・プラットフォームの構成によって異なります。たとえば、アプリケーション・ユーザーのWebリクエストにサービスを提供するために利用できるJava仮想マシン(JVM)が複数あるかどうかや、Oracle WebLogic Serverドメインが複数あるかどうかで変わります。このアプリケーションにおいて、実行時のJVMが1つのシナリオと複数のシナリオで、どの種類のプールがいくつ作成されるのかを理解するために、次の想定を見直してみます。
Fusion WebアプリケーションでHRModule
およびPayablesModule
という2つのアプリケーション・モジュールを使用する。
ユーザー・アプリケーション内で値リストをサポートするためによく使用される一連のビュー・オブジェクトがCommonLOVModule
に含まれており、HRModule
にもPayablesModule
にもよく使用されるLOVビュー・オブジェクトにアクセスするためにCommonLOVModule
のインスタンスがネストされている。
HRModule
およびPayablesModule
は、appuser
という名前の同一のJDeveloper接続定義を使用するように構成済である。
Oracle WebLogic Serverインスタンスが1つという構成で、このアプリケーションを単一のOracle WebLogic Serverドメインにデプロイすると、アプリケーション・ユーザーからのWebリクエストにサービスを提供する場合に利用可能なJava VMは1つのみになります。
HRModule
およびPayablesModule
にアクセスするWebページを全ユーザーが利用するものと仮定すると、次のようになります。
HRModule
ルート・アプリケーション・モジュール用のアプリケーション・モジュール・プールは1つ
PayablesModule
ルート・アプリケーション・モジュール用のアプリケーション・モジュール・プールは1つ
Java VMが1つであるこの場合は、全部でアプリケーション・モジュール・プールが2つになります。
注意:
再利用可能なCommonLOVModule
のネストされたインスタンスに対して、アプリケーション・モジュール・プールは存在しません。CommonLOVModule
のインスタンスは、HRModule
およびPayablesModule
のインスタンスにより、それぞれのアプリケーション・モジュール・プール内でラップされます。
次は、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)
この場合は、全部で8つのアプリケーション・モジュール・プールが4つのJVMに存在することになります。
「アプリケーション・モジュール・プールの構成パラメータに関する必知事項」でアプリケーション・モジュール・プールの構成パラメータをいろいろと確認する場合、それらのパラメータは1つのJVM内で指定した単一のアプリケーション・モジュールの特定の1つのアプリケーション・モジュール・プールに適用されることに注意してください。
ロード・バランシングによりユーザー・リクエストはOracle ADFが実行されている複数のJVMに分散されるため、各JVMにある個々のアプリケーション・モジュール・プールは、ユーザー負荷のn
分の1をサポートする必要があります。ここで、n
には、ユーザー・リクエストへのサービス提供に使用できるJVMの数です。Java VMの数を念頭に置いて、アプリケーション・モジュール・プールの適切な値を設定する必要があります。基本的には、負荷テストとアプリケーション・モジュール・プーリング統計の結果をサイズに関するパラメータの基準とし、次にその合計をプール数n
で割ります。この数は、アプリケーション・サーバー・ドメインとOracle WebLogic Serverインスタンスの使用状況に基づいて決定されます。たとえば、1つのプールにあるアプリケーション・モジュール数の最小値を10に設定しようと決めたが、このアプリケーションにサービスを提供しているOracle WebLogic Serverインスタンスが5つあるため最終的なプール数は5になったという場合、このパラメータは10 (1つのJVMにある指定されたアプリケーション・モジュールのみにサービスを提供)ではなく2 (10を5で割った商)に設定します。
使用可能なサイズ指定に関するパラメータの詳細は、「プールのサイズ指定に関するパラメータ」を参照してください。
ADFアプリケーションで構成パラメータを設定することにより、アプリケーション・モジュール・プールの実行時動作を制御できます。アプリケーション・モジュール・プール構成パラメータには、プールの動作、プールのサイズ指定、プールのクリーンアップ動作という3つの論理カテゴリがあります。
アプリケーション・モジュール・プールの実行時動作は、適切な構成パラメータの設定により制御します。それらのパラメータは、アプリケーション・モジュールの構成で宣言的な設定を行ったり、Java Systemパラメータとして指定したり、または実行時にプログラムで設定したりできます。
個々のアプリケーション・モジュールの実行時構成プロパティを表示および設定するには、アプリケーション・モジュール構成の概要エディタの「データベースとスケーラビリティ」タブを使用します(図57-1)。
始める前に:
アプリケーション・モジュール・プーリングの知識があると役立ちます。詳細は、「プール構成パラメータの設定」を参照してください。
アプリケーション・モジュールの構成パラメータについて理解します。アプリケーション・モジュール・プールのチューニング用の構成パラメータの詳細は、「アプリケーション・モジュール・プールの構成パラメータに関する必知事項」を参照してください。
予測されるレベルの使用量に関して、Fusion Webアプリケーションのチューニングに役立つベスト・プラクティス・ガイドラインは、『パフォーマンスのチューニング・ガイド』の「Oracle Application Development Frameworkのチューニング」を参照してください。
アプリケーションでJDBC URL接続タイプ(レガシーのみ)を定義する場合、このガイドの11g リリース・バージョンを参照して、ADFデータベース接続プールの構成パラメータに関するドキュメントを取得してください。
アプリケーション・モジュールのプーリング構成を編集するには:
アプリケーション・モジュール構成の概要エディタで指定した値は、アプリケーション・モジュールのXML定義を基準とする./common
サブディレクトリ内のbc4j.xcfg
というXMLファイルに保存されます。同一のJavaパッケージ内の全アプリケーション・モジュールの構成はすべて、この同じファイルに保存されます。通常は、bc4j.xcfg
ファイルを直接変更するのではなく、概要エディタを使用して特定のアプリケーション・モジュールの構成の設定を変更します。アプリケーション・モジュール構成の概要エディタを表示するには、「アプリケーション」ウィンドウでアプリケーション・モジュールをダブルクリックして、概要エディタの「構成」ナビゲーション・タブを選択します。次に、概要エディタの「構成」ページで構成を選択し、構成のハイパーリンクをクリックします。
たとえば、SummitADF
アプリケーションに含まれるBackOfficeAppModule
アプリケーション・モジュールのアプリケーション・モジュール構成(./src/oracle/summit/model/services/common
ディレクトリ内のbc4j.xcfg
ファイル)の概要エディタを見ると、BackOfficeAppModule
アプリケーション・モジュール用の2つの名前付き構成が含まれています。この場合、次の例のようにBackOfficeAppModuleLocal
構成とBackOfficeAppModuleShared
構成は、Oracle ADFモデル・テスターがJDBC URL接続を使用するように指定しています。JDBC接続の接続詳細は、プロジェクト・ディレクトリとの相対位置指定で./.adf/META-INF
と記述されるサブディレクトリにあるconnections.xml
ファイルにあります。
<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
ファイルに書き込まないことを理解しておくことも重要です。
実行時にアプリケーションによってアプリケーション・モジュール構成プロパティを制御する必要がある場合は、ADFビジネス・コンポーネントAPIを使用してこれらのプロパティを動的に設定できます。たとえば、一般的なADFアプリケーションでは、アプリケーション・モジュールによって静的なJDBCデータソースが構成されます。しかし、アプリケーションで、ユーザーに応じて様々なデータベースからデータを表示する必要がある場合、データソース名とアプリケーション・モジュール・プールのパラメータを実行時に設定することがあります。
oracle.jbo.common.ampool
パッケージにEnvInfoProvider
インタフェースを実装するJavaクラスを作成すると、構成プロパティをプログラムによって設定できます。クラス内では、次の例に示すように、getInfo()
メソッドをオーバーライドしてput()
をコールし、渡される環境ハッシュ表に値を格納します。
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ベース・アプリケーションで使用するには、次の例で示すように、セッションCookieファクトリのカスタム・クラスを実装する必要があります。カスタムなセッションCookieファクトリを使用するには、構成プロパティjbo.ampool.sessioncookiefactoryclass
に、セッションCookieファクトリのカスタム・クラスの完全修飾名を設定します。
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; } }
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レベルでスコープの対象となるプロパティの場合は、次の両方の処理を実行するのが、該当する一連のプロパティに対し全アプリケーション・モジュールで同じデフォルト値を確実に使用するための最も信頼性の高い方法です。
該当するプロパティ値が、どのアプリケーション・モジュールのbc4j.xcfg
ファイルの構成名/値のペア・エントリにも表示されないようにする。
実行環境内のJavaシステム・プロパティを使用してプロパティ値を設定する。
そのかわり、もし、MetaObjectManagerスコープのプロパティをbc4j.xcfg
ファイルに残した場合、Java VMの起動後にプールが作成される最初のアプリケーション・モジュールの構成に指定された値に対して望ましくない処理が行われます。
アプリケーション・モジュール・プールの構成パラメータは、プールの動作、プールのサイズ指定およびプールのクリーンアップ動作に関連する3つの論理的カテゴリに分類されています。デフォルトでは、Fusion Webアプリケーションにより、アプリケーション・モジュール・プーリングが有効になります。
アプリケーション・モジュールは、アプリケーション・モジュール・プールの動作に影響を与える構成パラメータを定義し、インスタンスがアプリケーション・モジュール・プールから削除された後、アプリケーション・モジュール・インスタンスが、接続プールから取得するJDBC接続を保持するかどうかを定義します。
ADFアプリケーション・モジュール・プールがデータベース接続プールを使用する方法は、「解放時にアプリケーション・モジュールの切断」の構成パラメータjbo.doconnectionpooling
の設定によって異なります。図57-1に示すように、デフォルトでは設定は無効であり、パラメータの設定はjbo.doconnectionpooling=false
になっています。
注意:
jbo.doconnectionpooling=false
と設定しても、データベース接続プーリングが実行されないわけではありません。これは、アプリケーション・モジュール・プールに戻されるときのチェックインの際、アプリケーション・モジュールがそのJDBC接続から切断されないという意味です。
アプリケーション・モジュール・インスタンスをアプリケーション・モジュール・プールで作成すると、JDBC接続が取得されます。デフォルトでは、1人のユーザーのリクエスト全体にわたって、ADFは同じアプリケーション・モジュール・インスタンス(その関連するメモリーとJDBC接続および状態を含む)を試して再利用するようにセッション・アフィニティの維持を優先します。目的はこのようなユーザーのパフォーマンス速度の向上です。jbo.doconnectionpooling=false
のデフォルト設定によってこの動作が有効になり、アプリケーション・モジュール・インスタンスは、クライアントによる以降のリクエスト全体にわたって、そのJDBC PreparedStatement
オブジェクトのキャッシュ化と再利用を維持できます。
ただし、Fusion Webアプリケーションにアクセスするユーザー数が増加するにつれて、JDBC接続、PREPARE文および結果セットを保持するサーバーへのメモリー要求が増します。数千のユーザーに対応するようにアプリケーション・モジュール・プールを構成する場合、各リクエスト後にJDBC接続を解放しないと、サポートされる管理対象ユーザー・セッションの一部を含め、サーバー負荷が高まる可能性があります。この状況は、Oracle Database 10g以降のOracle JDBCドライバと同様に、メモリー消費を超えてパフォーマンスを最適化するデータベース・ドライバを使用するように構成されるデプロイメント環境で特に顕著です。
JDBCドライバによってサーバー・メモリーがすぐに消費される状況を回避するには、jbo.doconnectionpooling=true
を設定してアプリケーション・モジュール・インスタンス接続のデフォルト動作をオーバーライドできます。ユーザー・セッションがアプリケーション・モジュールの使用を終える(通常は各HTTPリクエストの終了時)たびに、アプリケーション・モジュール・インスタンスが、該当するリクエストで使用していたJDBC接続との関係を断ち、その接続をJDBC接続プールに返します。該当するアプリケーション・モジュール・インスタンスは、ユーザー・セッションによって次回使用されるとき、JDBC接続プールからJDBC接続を再度取得し、該当するアプリケーション・モジュールがアプリケーション・モジュール・プールからチェックアウトされている期間(この場合も、通常は1つのHTTPリクエストの期間)、そのJDBC接続を使用します。アプリケーション・モジュール・インスタンス自体で、PreparedStatement
の作成に使用されたJDBC接続オブジェクトを切断するため、この状況では、アプリケーション・モジュールがプールからチェックアウトされるたびにprepareSession()
メソッドが起動され、データベース状態を初期化しなおすことができます。そのため、JDBC接続の解放をセッションに対して有効にする場合は、データベース接続の総数が少なくなるかわりに、JDBCを毎回セットアップするオーバーヘッドが少し増えます。
アプリケーション接続のために、基礎となる同一のデータベース・ユーザーを多数のアプリケーション・モジュール・プールがすべて使用する場合、違いが顕著になります。
50個の異なるアプリケーション・モジュール・プールがそれぞれアプリケーション・モジュール・インスタンスを内部に1つだけ持つ場合、jbo.doconnectionpooling=false
という条件では、50個のJDBCアプリケーション接続が使用されます。「最小使用可能サイズ」の構成パラメータjbo.ampool.minavailablesize=0
を設定し、適切なインスタンス・アイドル・タイムアウトが経過した後にアプリケーション・モジュール・プールを0インスタンスまで減らせるようにアプリケーション・モジュール・プーリングのサイズ・パラメータを設定すると、アプリケーション・モジュールは保持していた接続をそのプールから削除されるときに元に戻します。この状況は、管理対象アプリケーション・モジュール・インスタンスの数が少ないままの場合、ピーク需要時以外、または少数の同時ユーザーをアプリケーションがサポートする必要がある場合に最適です。
対照的に、50個の異なるアプリケーション・モジュール・プールがそれぞれ1つのアプリケーション・モジュール・インスタンスを持ち、jbo.doconnectionpooling=true
であった場合、使用中のJDBC接続の数は、これらのアプリケーション・モジュールのうち、異なるクライアントにより同時に使用されているものの数によって変わります。アプリケーション・モジュール・インスタンスは、プール内にあってユーザー・セッションにより使用されていない場合、jbo.doconnectionpooling=true
という条件があるため、そのJDBC接続を接続プールに解放します。そのアプリケーション・モジュール・インスタンスは、別のユーザーによって再度必要とされるかアプリケーション・モジュール・プール・モニターによって最終的にクリーンアップされるまでプール内で待機している間、JDBC接続には接続されていません。この状況は、ピーク需要時または同時ユーザー数の増加が予測される場合にFusion Webアプリケーションのスケーラビリティを確保する際に最適です。
jbo.doconnectionpooling
をtrue
に設定すると、「Transaction Disconnect Level」の構成パラメータjbo.txn.disconnect_level
のデフォルト設定1により、対応するJDBC接続への参照がドロップされた後でも、アプリケーション・モジュール、ビュー・オブジェクトおよび行セットをすべてメモリーに残し、有効のままにできます。この構成により、通常は解放時にアプリケーション・モジュールの受動化が実行される、この状況に関連するメモリー要件が軽減されます。かわりに、アクティブ化されるときに、このフレームワークで必要になるのは、カーソル位置の再実行と同期のみです。
あるいは、JDBC接続を保持することと、接続したままにすることのバランスをとるには、「接続しきい値」の構成パラメータjbo.ampool.connection_threshold
を構成します。このパラメータは、結合されたすべてのアプリケーション・モジュール・プール内のアプリケーション・モジュールが、アプリケーション・モジュール・プールのクリーンアップ時に保持する(解放して接続プールに戻さない)最大接続数を指定します。jbo.ampool.connection_threshold
パラメータを最大接続数(0よりも大きな値)に設定した場合、プールのクリーンアップ時にはアプリケーション・モジュールを切断するのが望ましいことを暗黙的に示したことになるため、構成パラメータjbo.doconnectionpooling
を有効にしないようにする必要があることに注意してください。jbo.ampool.connection_threshold
パラメータがアプリケーション・モジュール・プーリングにどのような影響を及ぼすかの詳細は、「アプリケーション・モジュール・プーリングの最適化に関する必知事項」を参照してください。
アプリケーション・モジュールでは、アプリケーション・モジュール・プールのサイズ指定に影響を与える構成パラメータを定義します。プール・モニターがそのリソース・クリーンアップ・パスのいずれかを実行する場合、アプリケーション・モジュール・インスタンスの数を、使用可能な最大および最小サイズ・パラメータで指定する範囲に送ろうとします。
プール・モニターが、未使用でアイドル状態のアプリケーション・モジュール・インスタンスを削除することで最大サイズを下回るようにプール・サイズを減らすことができない場合、タイムアウトしていないアクティブ・インスタンスを削除して、これらのアクティブ・アプリケーション・モジュールの状態を受動化します。「参照プール・サイズ」の構成パラメータjbo.recyclethreshold
では、受動化が行われるときにプール・モニターに残るアクティブ・アプリケーション・モジュールの数を決定します。デフォルトでは、プール・モニターが受動化を開始するときのしきい値は、10アプリケーション・モジュール・インスタンスです。
「最大使用可能プール・サイズ」の構成パラメータjbo.ampool.maxavailablesize
を使用して、プール・モニターによるリソースのクリーンアップ後、プール・サイズの上限範囲を指定できます。通常、同時ユーザー数に基づくデフォルトの最大使用可能サイズ25と、ユーザーがアプリケーション・モジュールのサービスにアクセスする必要がある頻度をオーバーライドします。ただし、サーバー・メモリーがアプリケーション・パフォーマンスの制限要因ではない場合、最大使用可能サイズを任意の大きな値に設定して、アクティブなユーザー・セッションに引き続き結び付けられているアプリケーション・モジュール・インスタンスの受動化とアクティブ化の影響を最小限に抑えることができます。
注意:
未使用のアプリケーション・モジュール・インスタンスを再生せず、通常のHTTPセッション・タイムアウトのアイドル時間を30分にするようにプールのクリーンアップを構成する場合、プール・サイズに十分大きな値を指定することが特に重要です。プールのクリーンアップの構成の詳細は、「プールの動作に関するパラメータ」を参照してください。
同様に、使用可能なアプリケーション・モジュール・インスタンスのベースラインを確保する場合にデフォルトの5インスタンスでは足りない場合、「最小使用可能プール・サイズ」の構成パラメータjbo.ampool.minavailablesize
を使用して、プール・サイズの下限範囲を指定できます。通常、ピーク使用時以外は、この値を同時ユーザー数と同じになるように設定してください。この値の設定が低すぎると、パフォーマンスに影響を与える可能性があるアプリケーション・モジュール・インスタンスの不要なインスタンス化が行われます。
アプリケーション・モジュールは、プール・モニターがそのリソース・クリーンアップ・パスのいずれかを実行するときに、リソースの再生処理に影響を与える構成パラメータを定義します。
Java VMごとに1つのアプリケーション・モジュール・プール・モニターがバックグラウンド・スレッドで実行し、プールのスキャンを起動して、デフォルトで600000ミリ秒(10分)間隔のクリーンアップを実行します。デフォルトのプール・ポーリング間隔を変更するには、「プール・ポーリング間隔」のパラメータjbo.ampool.monitorsleepinterval
を構成できます。
プール・モニターは次の2つの独立した戦略を使用して、どのアプリケーション・モジュール・インスタンスをプールから削除し、使用可能な新しいリソースとして解放可能かを判断します。
アプリケーション・モジュール・プール・モニターは、3600000ミリ秒(1時間、デフォルト値)を超える期間使用されていなかったアプリケーション・モジュール・インスタンスをプールから削除します。これらの未使用のアプリケーション・モジュール・インスタンスは、プールに構成された最小使用可能サイズにかかわらず再生されます。アプリケーション・モジュールに対する最長有効期間をオーバーライドするには、「最長有効期間」の構成パラメータjbo.ampool.timetolive
を設定できます。ただし、ほとんどのFusion Webアプリケーションでは未使用のアプリケーション・モジュール・インスタンスを解放する必要はないため、このパラメータ値を-1
に設定できます。
アプリケーション・モジュール・プール・モニターは、600000ミリ秒(10分、デフォルト値)を超える期間アイドル状態であったアプリケーション・モジュール・インスタンスをプールから削除します。このクリーンアップは、プール内のインスタンス数が、使用可能な最小サイズに達すると停止します。10分を超えるアイドル・ユーザー・セッションを許可する場合、「アイドル・インスタンス・タイムアウト」の構成パラメータjbo.ampool.maxinactiveage
を使用して、アプリケーション・モジュール・インスタンスのアイドル・タイムアウトをオーバーライドできます。
ベスト・プラクティス:
アプリケーション・モジュール・プールのクリーンアップ・パスの時間間隔を指定するときに、すべてのアプリケーション・モジュールで「プール・ポーリング間隔」の構成パラメータjbo.ampool.monitorsleepinterval
の値を同じに設定します。Java VM 1つにつきアプリケーション・モニターのプール・モニターは1つしかありませんので、アプリケーション・モジュール・プール・モニターのポーリング間隔として効果的に使用される値は、アプリケーション・モジュール構成内にあり、作成される最初のアプリケーション・モジュール・プールにより読取られる値です。すべてのアプリケーション・モジュールで同じ値が使用されるように設定すると、この値が予想可能な方法で確実に設定されます。
JDBC接続を保持することと、接続したままにすることのバランスをとるには、「接続しきい値」の構成パラメータjbo.ampool.connection_threshold
を構成します。このパラメータは、結合されたすべてのアプリケーション・モジュール・プール内のアプリケーション・モジュールがプールの次のクリーンアップ・サイクル時に保持する(解放して接続プールに戻さない)最大接続数を指定します。
接続しきい値のパラメータjbo.ampool.connection_threshold
を有効にする場合(0
よりも大きな値)、アプリケーション・モジュール接続は、チェックイン時ではなく、プールのクリーンアップ時に解放されます。クリーンアップ・モニターは、JDBC接続数の合計数が指定のしきい値を下回るまで最後に使用されたアプリケーション・モジュールを切断しようと最善の努力をします。jbo.ampool.connection_threshold
パラメータを有効にすると、アプリケーション・モジュール・プールのクリーンアップの実行タイミングが変わるため、これは、jbo.ampool.connection_threshold=true
パラメータの設定に互換性がないことを表します。
注意:
プールのクリーンアップ・サイクルでアプリケーション・モジュールを切断するためのしきい値を構成する場合、値がfalse
(デフォルト)になるように必ずjbo.doconnectionpooling
を無効にしてください。接続しきい値パラメータは、設定jbo.doconnectionpooling=true
と互換性がありません。これは、この設定により、アプリケーション・モジュールのチェックイン時にJDBC接続が解放されて接続プールに戻され、かつ、この設定をjbo.txn.disconnect_level
パラメータと組み合せて使用すると、ビジネス・コンポーネントがメモリーに残るようになるためです。jbo.doconnectionpooling
パラメータの詳細は、「プールの動作に関するパラメータ」を参照してください。
たとえば、2つのアプリケーション・モジュール・プールの接続しきい値パラメータを10に設定するとします。この場合、アプリケーション・モジュール・プール1には7つのアプリケーション・モジュールがあり、プール2には8つのアプリケーション・モジュールがあるため、JDBC接続の合計は15になります。アプリケーション・モジュール・プールのクリーンアップ・モニターが実行すると、モニターは、5つの接続(15の接続リソース - 接続しきい値10)を再生するように最大限の努力をします。モニターは、各プールの接続済アプリケーション・モジュールの総数に比例してアプリケーション・モジュールを切断します。この場合、各プールのアプリケーション・モジュール接続の1/3 (5/15)が切断されます。そのため、プール1は2つの接続(7/3)を解放し、プール2は3つの接続(8/3)を解放します。この場合、プール・サイズの小数は切り上げられます。
クリーンアップ・モニターは、接続済リソースの数が指定の制限値を下回るまでアプリケーション・モジュールを切断する最大限の努力をしますが、使用可能な状態でアプリケーション・モジュールが十分にない場合、それを実行できないことに注意してください。JDBC接続が効率的に解放されるようにするために、「プール・ポーリング間隔」のパラメータjbo.ampool.monitorsleepinterval
を構成してモニターのスリープ時間を短縮できます。
Fusion Webアプリケーションではユーザーごとにデータベース状態を設定できます。ストアド・プロシージャをコールして、特定のユーザーのセッションに関連するデータベース状態を初期化することが必要な場合があるため、これには大きなメリットがあります。
現在のユーザー・セッションに関連するデータベース状態を初期化するために、ストアド・プロシージャの起動が必要な場合もあります。その初期化を実行するには、アプリケーション・モジュールのprepareSession()
メソッドをオーバーライドして行うのが正しい方法です。
Fusion Webアプリケーションでは、ユーザーごとにデータベース状態を設定できます。通常は、データベースCONTEXT
ネームスペースを作成し、PL/SQLプロシージャをそれに関連付け、SYS_CONTEXT()
SQL関数を使用してコンテキストから値を参照します。
たとえば、次の例に示すように、PL/SQLパッケージを使用して、現在認証されているFusion Webアプリケーション・ユーザーの名前を保持する変数をパッケージ・レベルで設定および取得できます。
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
関数を参照して、ユーザーごとに状態を問い合せることができます。
データベース状態を設定するには、「IN引数のみのストアド・プロシージャの呼出し方法」に示したものによく似たcallStoredProcedure()
ヘルパー・メソッドをアプリケーション・モジュール・フレームワーク拡張クラス(AppModuleImpl
.java
)に定義します。その後、カスタム・アプリケーション・モジュール・クラスは、このフレームワーク拡張クラスを拡張し、次の例に示すsetCurrentUserInPLSQLPackage()
ヘルパー・メソッドを定義します。このヘルパー・メソッドはcallStoredProcedure()
メソッドを使用して、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}); }
このヘルパー・メソッドを使用し、カスタム・アプリケーション・モジュール・クラスは、次の例に示すように、prepareSession()
メソッドをオーバーライドします。
// In CustomAppModuleImpl.java
protected void prepareSession(Session session) {
super.prepareSession(session);
getLoggedInUser().retrieveUserInfoForAuthenticatedUser();
setUserIdIntoUserDataHashtable();
setCurrentUserInPLSQLPackage();
}