12

それが である場合、なぜEJBを使用する@ManagedBeanのでしょうか? 以前はショッピング カートと会話状態の維持に使用していましたが、マネージド Bean はユーザー セッション中に保持されるため、そこに状態を保存し、ビジネス ロジックのために SLSB を呼び出すことができます。あれは正しいですか?そうであれば、ステートフルな ejb は、トランザクションが必要な場合など、より具体的なアプリケーションのために残されますか?@SessionScoped@Stateful

4

1 に答える 1

13

多くの場合、ステートレス セッション Bean は多くのビジネス上の問題に使用できます。

ステートフルとは必ずしもリモートサーバーのみが状態を保持することを意味するわけではありませんが、これは確かにオプションの 1 つです。リモート Swing クライアントは、最初に一連のデータをステートフル セッション Bean に送信し、スタブを保持してから、このデータを操作するいくつかのコマンドを送信できます。これにより、クライアントは毎回同じ (大量の) データを送信する必要がなくなります。

リモートでの使用例では、Web クライアント (ブラウザー) が使用されているときの HTTP セッションの使用法を多少反映しています。主な違いは、ここではセッションが Bean ごとであるのに対し、HTTP セッションでは、セッションは多くの Bean によって共有されるスコープであることです。HTTP セッションは Cookie に基づいており、Cookie はブラウザー全体のドメインに対してグローバルであるため、HTTP セッションは同じクライアントからの複数のセッションを直接サポートすることはできません (たとえば、タブごとまたはウィンドウごと)。これは、ステートフル セッション Bean では簡単です。

でも...

リモート EJB と通信するリモート Swing クライアントは、それほど一般的ではありません。

質問で説明したコンテキストでは、通常はローカル EJB を使用し、ほとんどの状態を HTTP セッション (共有には注意してください!) に保存し、最近ではビュー スコープまたは会話スコープに保存します。

最後に、このシナリオでステートフル セッション Bean を使用するのはどのような場合でしょうか。

重要な使用例の 1 つはextended persistence contextinJPAです。通常、トランザクション スコープのエンティティ マネージャでは、エンティティが EJB メソッド呼び出しのトランザクション境界を超えると、切り離されます。ユーザー インタラクション間で (楽観的に) エンティティをロックしたい場合、これは望ましくありません。ロックを失います。

拡張永続コンテキストを使用すると、ステートフル セッション Bean への呼び出しから戻ったときに、エンティティがアタッチされたままになり、ロックが有効になります。これはプレビュー機能にとって非常に便利で、プレビュー後にOKを出したときに、他の誰もエンティティに変更を加えていないことを保証します。または、ショッピング カートで、カート内のアイテムをしばらく他の人に販売できないようにする必要がある場合もあります。

于 2011-01-30T15:57:06.340 に答える