Java EEを使っていた際に、実装上の問題でエラーになったことがあったのでここの記載します。

問題となったのはSattelessSessionBeanの特徴であるインスタンスの再利用です。

[仕様]使用されたインスタンスが一定時間コンテナ上にプールされ、必要になればそこからインスタンスが利用される。存在しなければ、インスタンスを作成される

このため、グローバル変数に検索結果などを保存したままになっていると使用されなくなってもインスタンスが破棄されるまで保持されたままになります。

1.初期状態

@statelessSessionBean
クラスA{
変数B=””
メソッド(){
B=B+”C”;
}
}

2.処理後① メソッドを実行すると変数BはCになる

3.別のインスタンスからクラスAをInjectする

4.処理後② メソッドを実行すると変数Bは以下の2パターンになる
呼び出しまでの時間が短い場合→CCになる
時間を開けて実行した場合→Cになる

当然ですが、グローバル変数に値を入れるとこのようなことになるので使用しないことを意識することが重要だと思います。

すべてをStateFullSessionBeanにすれば解決することもがありますが、インスタンス生成に伴う処理速度や負荷の問題もあると思うので、あまりおすすめできないですね。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です