ここでは,Enterprise Beanの同時実行数を制御する方法について,Enterprise Beanの種類ごとに説明します。なお,インスタンスプーリングおよびセッション制御によるEnterprise Beanの同時実行数制御は,EJBコンテナの機能を利用して実現します。EJBコンテナの機能の詳細は,マニュアル「Cosminexus アプリケーションサーバ 機能解説 基本・開発編(EJBコンテナ)」の「2. EJBコンテナ」を参照してください。
Enterprise Beanの同時実行数を制御する場合,EJBコンテナの機能である,次の2種類の機能を利用できます。
なお,Enterprise Beanの種類ごとに使用できる機能が異なります。
Enterprise Beanの種類ごとに使用できる同時実行数制御の機能を次の表に示します。
表8-5 Enterprise Beanの種類ごとに使用できる同時実行数制御の機能
Enterprise Beanの種類 | 使用できる制御機能 |
---|---|
Stateless Session Bean※ | インスタンスプーリング |
Stateful Session Bean | セッション制御 |
Entity Bean | インスタンスプーリングとセッション制御 |
Message-driven Bean | インスタンスプーリング |
注※ Stateless Session Beanの同時実行数を制御する場合は,CTMを利用することをお勧めします。CTMを利用して同時実行数を制御する方法については,「8.3.6 CTMを使用して同時実行数を制御する」で説明します。
なお,Enterprise Beanの同時実行数制御のうち,実行待ちリクエストをキューの概念で管理できるのは,Message-driven Beanだけです。Message-driven Beanでは,JMSのキューを使用して実行待ちリクエストを管理します。これ以外のEnterprise Beanでは,同時実行数以上のリクエストが送信された場合,設定に応じて次のどれかの処理が実行されます。
Stateless Session Beanでは,インスタンスプーリングを利用できます。通常の同時アクセス数をインスタンスプーリングの最小値として設定して,想定している最大同時アクセス数以上の値を,インスタンスプーリングの上限値に指定します。これによって,通常のアクセス時にはインスタンスを生成する時間を省略できるので,処理性能が向上します。さらに,アクセス数が増大した場合でも,想定している最大同時アクセス数までは処理でき,それ以上のリクエストの実行は待たせるように制御できます。
なお,デフォルトの設定の場合,上限値以上のリクエストがエラーで返却されることはありません。プールされているインスタンスに空きができるまで待ち続けます。エラーで返却したい場合は,必要に応じてインスタンス取得待ちのタイムアウトを設定してください。
Stateful Session Beanでは,クライアントごとにセッションごとの状態があるため,厳密な同時実行数制御はできません。ただし,セッション単位での流量制御(セッション制御)ができます。
想定している最大同時セッション数以上の値を,セッション制御の上限値として指定します。アクセス数が増大して,想定している最大同時セッション数以上のアクセスがあった場合には,セッションを確立しないで,クライアントに例外(java.rmi.RemoteException)を通知できます。
Entity Beanでは,クライアントごとに管理する状態を持つセッションの上限値の設定とインスタンスプーリングによって,同時実行数の制御ができます。なお,セッション数が上限に達した場合,インスタンスプーリングに空きがあっても,新しいセッションでのリクエストは実行できません。
セッション数の上限を超えた場合は,セッションの作成に失敗した時点ですぐにクライアントに例外(java.rmi.RemoteException)が通知されます。また,デフォルトの設定の場合,インスタンスプール数の上限値以上のリクエストは,エラーで返却されることはなく,プールされているインスタンスに空きができるまで待ち続けます。エラーで返却したい場合は,必要に応じてインスタンス取得待ちのタイムアウトを設定してください。
なお,Entity Beanに対するリクエストの実行では,データベースへのアクセスが発生します。このため,同時実行できるリクエスト数は,データベースにアクセスするためのコネクション数にも制限されます。
Message-driven Beanでは,インスタンスプーリングを利用できます。想定している最大メッセージ数以上の値を,インスタンスプーリングの上限値として指定します。これによって,メッセージ到着時にインスタンスを生成する時間を省略できるので,処理性能が向上します。さらに,メッセージ数が増大した場合でも,インスタンスプーリングの上限値以上のメッセージは,実行を待たせるように制御できます。
なお,Message-driven Beanでは,JMSのキューによって,到着メッセージを実行待ちキューで管理できます。