- - PR -
セッションBeanについて
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-07-17 15:24
なべぞうさんの書き込み (2003-07-17 14:32) より:
>一応、スレッド元に参照元としてリンクを張っていたのですが 分かりづらかったですね、すみません。 こちらこそ見落としていました。すいません。 EJB仕様をざっと見る限りでは、「コンテナは一つのインスタンスは同時に一つだけ メソッドを実行することを保証しなければならない」ようです。同時呼び出しがあった 場合には、「RemoteExceptionまたはEJBExceptionをthrowしてもよい」と規定されて います。 #そんなコンテナは使いたくないですが したがって一つのインスタンスに複数のスレッドから同時にアクセスされるということ はないのではないでしょうか。ただし、Stateless Session Beanに関しては、 「同一クライアントの同一トランザクション内の呼び出しでも異なるインスタンスを 割り当ててよい」とのことなので、「クライアントとインスタンスは1対1」というのは 誤解を招く表現だと思います。 | ||||
|
投稿日時: 2003-07-17 16:07
ukさんありがとうございます。
整理すると ・ステートフルセッションBeanは「コンテナが一つのインスタンスは同時に一つだけ メソッドを実行することを保証する」ので同時に要求が発生した場合は、コンテナ の実装によって"RemoteExceptionまたはEJBExceptionがthrowされる"か"要求が シリアライズ化される"ことになる。 ・ステートレスセッションBeanは「同一クライアントの同一トランザクション内の呼 び出しでも異なるインスタンスを割り当ててよい」ので1つのインスタンスに同時 に要求が発生することはない。 という理解で宜しいでしょうか? | ||||
|
投稿日時: 2003-07-17 16:33
なべぞうさんの書き込み (2003-07-17 16:07) より:
>・ステートフルセッションBeanは「コンテナが一つのインスタンスは同時に一つだけ メソッドを実行することを保証する」ので同時に要求が発生した場合は、コンテナ の実装によって"RemoteExceptionまたはEJBExceptionがthrowされる"か"要求が シリアライズ化される"ことになる。 「シリアライズ化される」というと、後の呼び出しが待たされるイメージですが、 別のインスタンスを割り当てればいいことですね。 >・ステートレスセッションBeanは「同一クライアントの同一トランザクション内の呼 び出しでも異なるインスタンスを割り当ててよい」ので1つのインスタンスに同時 に要求が発生することはない。 まあ、そういうことです。ステートレスセッションBeanではクライアントやクライアント が使用しているリモート/ローカルインタフェースとBeanインスタンスが対応している 必要はないので、一つのリモート/ローカルインタフェースオブジェクトを使って マルチスレッドで呼び出しても一つのインスタンスに対して複数の呼び出しが同時に 実行されることはない、ということですね。 さらにいうとこの仕様に従えば、ステートレスセッションBeanの実装クラスでは、 インスタンス内のリソースに関しては排他制御を行なう必要がない、ということ ですね。 | ||||
|
投稿日時: 2003-07-17 17:04
元ねたはたぶんここです。
http://edocs.beasys.co.jp/e-docs/wls/docs81/ejb/EJB_environment.html#664293 以下抜粋です。 EJB クラスのすべてのインスタンスがアクティブで、max-beans-in-free-pool に達した場合、EJB クラスを要求する新しいクライアントは、アクティブ EJB がメソッド呼び出しを完了するまでブロックされます。トランザクションがタイムアウトになった場合 (トランザクション非対応の呼び出しでは、5 分経過した場合)、WebLogic Server は、リモート クライアントに対しては RemoteException を、ローカル クライアントに対しては EJBException を送出します。 | ||||
|
投稿日時: 2003-07-18 09:24
ということは、プリンスさんのレスも総合するとステートレス、ステートフル
に関わり無く同時に要求が発生した場合はmax-beans-in-free-poolに達してい なければ別々のインスタンスが割り当てられる。また全てのEJBがアクティブで max-beans-in-free-poolに達した場合、新しい要求はブロックされ、トランザ クションがタイムアウトになるとExceptionが発生します。 ・・という理解で良いでしょうか。 あと、デプロイメント・ディスクリプタにトランザクションのタイプを設定し ますが、まだEJBに処理が移ってない状態(クライアントから要求があり、入り 口となるセションBeanで待ちが発生した)の場合が、プリンスさんレスにある の"トランザクション非対応の呼び出しでは、5 分経過した場合"に該当すると いうことでしょうか? | ||||
|
投稿日時: 2003-07-18 10:00
WebLogicではmax-beans-in-free-pool はステートレスとEntityBeanにしか 存在しないパラメータですのでステートフルではPoolはありません。 # もしかしたらMDBもあったかも… ステートレスセッションBeanをPoolのサイズ以上使おうとするとたしかExceptionが throwされたと思います。 ちょっと確認しないとわかりませんが… | ||||
|
投稿日時: 2003-07-18 10:00
なんだか話がとても複雑になっていますが、私の理解では単純に、
●EJBクラスの1つのインスタンスを、複数のスレッドが同時に実行するこ とはできない(reentrant指定の場合を除く) です。このルールのおかげで、Beanクラスはスレッドセーフを気にする必要 なく記述できるのが、EJBの大きなメリットです。 このルールに違反したとき(あるスレッドが実行中のBeanインスタンスを ほかのスレッドが呼び出した場合)の振る舞いは、製品依存な部分があり ますが、一般的には、 ●Stateful/Stateless Session Bean: RemoteException送出 ●Entity Bean: ブロックされる となります。ですから、 >し、同時に複数クライアントからアクセスされたときはEJB >コンテナが排他処理をしてくれるのでしょうか?この辺の、同時 これはYESです。 ただ、Entity Beanの場合はこれはよくある状況ですが、Session Beanの場合、 ●Stateless: リクエストごとに別々のインスタンスを割り当て ●Stateful: セッション(ブラウザ)ごとに別々のインスタンスを割り当て という使い方になりますので、ひとつのインスタンスへの同時アクセスは 通常は起こりません。これはちょうど、サーブレットのSingleThreadModel と同じ仕組みです。各インスタンス内ではシングルスレッドですが、システム 全体はマルチスレッドで動作します。 例外は、reentrantコール(Beanが自分のEJBObjectを呼び出す)か、ブラウザの ボタンの2度押しなどです。これらの場合、RemoteExceptionが発生します。 | ||||
|
投稿日時: 2003-07-18 10:16
werdnaさん、にっくさんレス有難うございます。
スレッド元の疑問に戻って考えると >クライアントとセッションBeanのインスタンスとは1対1であり、複数のクライアント >からのアクセスはできません。 ということは、にっくさんの説明にある●マークの仕組みにより通常ありえないというこ とですね。 | ||||
