8.3.5 Enterprise Beanの同時実行数を制御する
ここでは,Enterprise Beanの同時実行数を制御する方法について,Enterprise Beanの種類ごとに説明します。なお,インスタンスプーリングおよびセッション制御によるEnterprise Beanの同時実行数制御は,EJBコンテナの機能を利用して実現します。EJBコンテナの機能の詳細は,マニュアル「アプリケーションサーバ 機能解説 基本・開発編(EJBコンテナ)」の「2. EJBコンテナ」を参照してください。
- 〈この項の構成〉
(1) Enterprise Beanの同時実行数制御で使用できる機能の種類
Enterprise Beanの同時実行数を制御する場合,EJBコンテナの機能である,次の2種類の機能を利用できます。
- インスタンスプーリング
-
Enterprise Beanのインスタンスを事前に作成しておくことで,クライアントからリクエストが送信されたときにすぐ処理を実行できるようにする機能です。プールするインスタンス数の上限値を設定することで,上限値以上のリクエストの実行を待たせることができます。これによって,同時実行数が制御できます。
- 参考
-
運用時にCTMの同時実行数を動的に変更する場合は,上限値は無制限に設定してください。
- セッション制御
-
セッション内で,同時に生成できるセッション(インスタンス)数を制限する機能です。
なお,Enterprise Beanの種類ごとに使用できる機能が異なります。
Enterprise Beanの種類ごとに使用できる同時実行数制御の機能を次の表に示します。
Enterprise Beanの種類 |
使用できる制御機能 |
---|---|
Stateless Session Bean※ |
インスタンスプーリング |
Stateful Session Bean |
セッション制御 |
Entity Bean |
インスタンスプーリングとセッション制御 |
Message-driven Bean |
インスタンスプーリング |
なお,Enterprise Beanの同時実行数制御のうち,実行待ちリクエストをキューの概念で管理できるのは,Message-driven Beanだけです。Message-driven Beanでは,JMSのキューを使用して実行待ちリクエストを管理します。これ以外のEnterprise Beanでは,同時実行数以上のリクエストが送信された場合,設定に応じて次のどれかの処理が実行されます。
-
インスタンスに空きが出るまで待ち続ける
-
すぐに例外としてクライアントに返却する
-
インスタンス取得用に設定したタイムアウト時間が経過したら,例外としてクライアントに返却する(Stateless Session Beanのmethod-readyプールまたはEntity Beanのpoolプールの場合)
(2) Stateless Session Beanの同時実行数制御
Stateless Session Beanでは,インスタンスプーリングを利用できます。通常の同時アクセス数をインスタンスプーリングの最小値として設定して,想定している最大同時アクセス数以上の値を,インスタンスプーリングの上限値に指定します。これによって,通常のアクセス時にはインスタンスを生成する時間を省略できるので,処理性能が向上します。さらに,アクセス数が増大した場合でも,想定している最大同時アクセス数までは処理でき,それ以上のリクエストの実行は待たせるように制御できます。
なお,デフォルトの設定の場合,上限値以上のリクエストがエラーで返却されることはありません。プールされているインスタンスに空きができるまで待ち続けます。エラーで返却したい場合は,必要に応じてインスタンス取得待ちのタイムアウトを設定してください。
(3) Stateful Session Beanの同時実行数制御
Stateful Session Beanでは,クライアントごとにセッションごとの状態があるため,厳密な同時実行数制御はできません。ただし,セッション単位での流量制御(セッション制御)ができます。
想定している最大同時セッション数以上の値を,セッション制御の上限値として指定します。アクセス数が増大して,想定している最大同時セッション数以上のアクセスがあった場合には,セッションを確立しないで,クライアントに例外(java.rmi.RemoteException)を通知できます。
- ポイント
-
リクエスト単位で同時実行制御が必要な場合は,サーブレット,JSPまたはStateless Session Beanを経由してStateful Session Beanを呼び出すことで,Webアプリケーションの同時実行数制御またはインスタンスプーリングを利用した同時実行数制御ができるようになります。
(4) Entity Beanの同時実行数制御
Entity Beanでは,クライアントごとに管理する状態を持つセッションの上限値の設定とインスタンスプーリングによって,同時実行数の制御ができます。なお,セッション数が上限に達した場合,インスタンスプーリングに空きがあっても,新しいセッションでのリクエストは実行できません。
セッション数の上限を超えた場合は,セッションの作成に失敗した時点ですぐにクライアントに例外(java.rmi.RemoteException)が通知されます。また,デフォルトの設定の場合,インスタンスプール数の上限値以上のリクエストは,エラーで返却されることはなく,プールされているインスタンスに空きができるまで待ち続けます。エラーで返却したい場合は,必要に応じてインスタンス取得待ちのタイムアウトを設定してください。
なお,Entity Beanに対するリクエストの実行では,データベースへのアクセスが発生します。このため,同時実行できるリクエスト数は,データベースにアクセスするためのコネクション数にも制限されます。
(5) Message-driven Beanの同時実行数制御
Message-driven Beanでは,インスタンスプーリングを利用できます。想定している最大メッセージ数以上の値を,インスタンスプーリングの上限値として指定します。これによって,メッセージ到着時にインスタンスを生成する時間を省略できるので,処理性能が向上します。さらに,メッセージ数が増大した場合でも,インスタンスプーリングの上限値以上のメッセージは,実行を待たせるように制御できます。
なお,Message-driven Beanでは,JMSのキューによって,到着メッセージを実行待ちキューで管理できます。
- 参考
-
TP1インバウンド連携機能を使用してOpenTP1のSUPからMessage-driven Beanを呼び出す場合や,CJMSプロバイダを使用してMessage-driven Beanを呼び出す場合,ここで説明した内容以外に,使用するコンポーネントを考慮した同時実行数を検討する必要があります。詳細は,マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「4. OpenTP1からのアプリケーションサーバの呼び出し(TP1インバウンド連携機能)」,または「7. CJMSプロバイダ」を参照してください。