[解決済み] ステートレスおよびステートフルなEnterprise Java Beans
質問
Java EE 6のチュートリアルを進めていて、ステートレスおよびステートフルセッションビーンとの違いを理解しようとしています。ステートレス・セッションBeanがメソッド呼び出しの間に状態を保持しないのであれば、なぜ私のプログラムはそのように動作するのでしょうか。
package mybeans;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
@LocalBean
@Stateless
public class MyBean {
private int number = 0;
public int getNumber() {
return number;
}
public void increment() {
this.number++;
}
}
クライアント
import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import mybeans.MyBean;
import java.io.PrintWriter;
@WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
public class ServletClient extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
MyBean mybean;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
mybean.increment();
out.println(mybean.getNumber());
}
}
私はgetNumberが毎回0を返すと思っていたのですが、1を返しており、ブラウザでサーブレットを再読み込みするともっと増えます。問題は、ステートレスセッションビーンがどのように動作するかについての私の理解であり、もちろんライブラリやアプリケーションサーバーの問題ではありません。誰か、ステートフルに変更したときに異なる動作をするステートレスセッションビーンの簡単なハローワールドタイプの例を教えてください。
どのように解決するのですか?
重要な違いは、プライベートメンバー変数ではなく、状態を特定のユーザーに関連付けることです("ショッピングカート"を考えてみてください)。
ステートフルセッションBeanのステートフルな部分は、サーブレットにおけるセッションのようなものです。 ステートフルセッションビーンによって、ウェブクライアントがない場合でも、アプリがそのセッションを保持することができます。 アプリサーバーがオブジェクトプールからステートレスセッションビーンを取り出すとき、それは特定のユーザーと関連付けられていないため、任意のリクエストを満たすために使用できることがわかります。
ステートフルセッションビーンは、最初にそれを取得したユーザーに提供されなければなりません。なぜなら、彼らのショッピングカートの情報は彼らだけに知られていなければならないからです。 アプリサーバーは、これがそうであることを保証します。 もしあなたが買い物を始め、私が来たときにアプリサーバーがあなたのステートフルセッションビーンを渡してくれたら、あなたのアプリがどれだけ人気が出るか想像してみてください!
つまり、あなたのプライベートデータメンバーは確かに "state" ですが、それは "shopping cart" ではないということです。 インクリメントされた変数が特定のユーザーと関連付けられるように、あなたの (非常に良い) 例をやり直してみてください。 それをインクリメントして、新しいユーザーを作成し、彼らがまだインクリメントされた値を見ることができるかどうかを確認します。 正しく行われた場合、すべてのユーザーは自分のバージョンのカウンターだけを見ることができるはずです。
関連
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
Javaでよくある構文エラー
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
-bash: java: コマンドが見つからない 解決方法
-
Javaがテキストファイルを読み込む
-
アノテーション「@Retention」の役割
-
Junitのユニットテストエラー
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。