ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド

15.4 Enterprise Beanインスタンス/EJB object/EJB homeの関係

Enterprise Beanインスタンス/EJB object/EJB homeの関係について説明します。

クライアントアプリケーションは、始めにネーミングサービスからEJB homeのオブジェクトリファレンスを取得します。EJB homeのメソッド(createメソッドやfinderメソッドなど)を実行して、EJB objectのオブジェクトリファレンスを取得します。EJB objectに対してメソッドを実行すると、コンテナは必要に応じてEnterprise Beanインスタンスに処理を渡します。
以下にSTATELESS Session Beanの場合の関係図を示します。



以下について説明します。

EJB objectとEnterprise Beanインスタンスの生成タイミング

Enterprise Beanの種類によって、EJB objectとEnterprise Beanインスタンスの生成タイミングや生成される数が異なります。

STATELESS Session Bean

STATELESS Session Beanは、トランザクション状態やアプリケーション変数をEnterprise Beanインスタンスに保持しないため、Enterprise Beanインスタンスをプーリングして利用します。
クライアントからリクエストが来ると、EJBコンテナはプールからインスタンスを1つ取得して、そのインスタンス上で処理を実行します。プールにインスタンスがない場合、インスタンスを1つ作成し、そのインスタンス上で処理を実行します。
処理が終了したらインスタンスをプールに戻して、クライアントに処理結果を返却します。

STATELESS Session Beanのインスタンスを、プロセスへの初回アクセス時に同時接続数に指定した数だけ生成します。初期起動インスタンス数が指定された場合、STATELESS Session Beanのインスタンスは、IJServer起動時に指定された数分生成されます。
また、クライアントのリクエストをEnterprise Beanインスタンスに渡すEJB objectを、起動時に1つだけ生成します。
EJB objectとEnterprise Beanインスタンスは、IJServerの停止時に削除されます。

STATEFUL Session Bean

STATEFUL Session Beanは、トランザクション状態やアプリケーション変数をEnterprise Beanインスタンスに保持できます。EJB homeに対してcreateメソッドが実行されるたびに、EJB objectとEnterprise Beanインスタンスを生成して、同一のEJB objectにアクセスすると、同一のEnterprise Beanインスタンスで処理を実行します。処理終了後にEJB objectに対してremoveメソッドを実行して、EJB objectとインスタンスを削除します。

Entity Bean

Entity BeanのEJB objectは、EJB homeメソッドに対してメソッドを実行するタイミングで、必要に応じてコンテナが生成します。

Entity Beanのインスタンスを初期起動インスタンス数だけプーリングします。Enterprise Beanインスタンスの生成タイミングは、インスタンス生成モードによって異なります。STATELESS Session BeanのEnterprise Beanインスタンスとは位置付けが異なり、DBMSのレコードにEntity BeanのEnterprise Beanインスタンスをマッピングします。1クライアント(1トランザクション)でアクセスしたDBMSのレコード数分だけEnterprise Beanインスタンスがプールから使用され、トランザクションを完了した際にEnterprise Beanインスタンスをプールに返却します。

プールにEnterprise Beanインスタンスが存在しない場合、同一トランザクション内で使用したEnterprise Beanインスタンスを1つ選択してインスタンスに格納されているレコードデータをDBMSに反映し、そのインスタンスを別のレコードデータを格納するインスタンスとして再利用します。同一トランザクション内で使用したEnterprise Beanインスタンスが存在しない場合には、Enterprise Beanインスタンスを1つだけ動的に生成して使用します。使用したEnterprise Beanインスタンスはトランザクション完了後にプールに返却しますが、動的に使用したインスタンスについてはトランザクションが完了した際に破棄します。Enterprise Beanインスタンスが頻繁に再利用されると、性能に影響があります。

Entity Beanの初期起動インスタンス数を定義します。設定方法については、Interstage管理コンソールのヘルプを参照してください。

レコードデータの反映はBMPの場合にはejbStoreメソッドを実行して行います。CMP1.1もしくはCMP2.0の場合には、コンテナがデータベースに対してUPDATE文を実行して行います。
複数トランザクションで同時に処理を実行した場合、SELECT文とUPDATE文が同時に実行されるとデッドロックが発生することがあります。
このような場合にはSELECT文にFOR UPDATEを指定するようにしてください。
詳細は“トラブルシューティング集”の“デッドロックが発生する場合”を参照してください。

Message-driven Bean

Message-driven Beanは、トランザクション状態やアプリケーション変数をEnterprise Beanインスタンスに保持しないため、Enterprise Beanインスタンスをプーリングして利用します。
Destinationからメッセージが配信されると、EJBコンテナはプールからインスタンスを1つ取得してそのインスタンス上で処理を実行します。処理が終了したらインスタンスをプールに戻して処理を終了します。

Enterprise Beanインスタンス生成/削除時に呼び出されるメソッド

Enterprise Beanインスタンスの生成や削除のタイミングで、Enterprise Beanインスタンスの各種メソッドが実行されます。


Enterprise Beanインスタンス生成時

Bean種別

メソッド名

STATELESS Session Bean

setSessionContext
ejbCreate

STATEFUL Session Bean

setSessionContext
ejbCreate

Entity Bean

setEntityContext

Message-driven Bean

setMessageDrivenContext
ejbCreate

Enterprise Beanインスタンス削除時

Bean種別

メソッド名

STATELESS Session Bean

ejbRemove

STATEFUL Session Bean

ejbRemove

Entity Bean

unsetEntityContext

Message-driven Bean

ejbRemove

STATELESS Session Bean/Entity Bean/Message-driven Beanの場合、インスタンスを停止時に削除するため、上記メソッドを停止時に呼び出します。
ただし、強制停止の場合にはメソッドは実行されずに強制的に停止されます。