4

セッション スコープのバッキング Bean が複数のスレッドによって同時にアクセスされる可能性はありますか?

サーブレットの仕様によると、それは可能です:

要求スレッドを実行する複数のサーブレットは、同じセッション オブジェクトに同時にアクティブにアクセスできます。コンテナーは、セッション属性を表す内部データ構造の操作がスレッドセーフな方法で実行されるようにする必要があります。開発者は、属性オブジェクト自体へのスレッド セーフ アクセスを担当します。これにより、HttpSession オブジェクト内の属性コレクションが同時アクセスから保護され、アプリケーションがそのコレクションを破損させる可能性がなくなります。

ただし、サーバー (JBoss) が同じセッションに対して異なるスレッドを使用するようにすることはできませんでした。複数のタブを開いて、あるタブで実行時間の長いリクエストを開始し、別のタブでリクエストを開始すると、最初のタブで開始されたアクションが完了するまで、2 番目のタブは応答を待たなければなりませんでした。

また、バッキング Bean のブレークポイントでスレッドをブロックして、これを確認しました。スレッドを再開するまで、同じセッションの他のタブでは何もできませんでした。

それにもかかわらず、本番ログには奇妙な例外がいくつかあります。これまでのところ、考えられる唯一の説明は、複数のスレッドが同じセッション スコープのバッキング Bean に同時にアクセスしているということです。

4

1 に答える 1

2

はいA Servlet session is thread safe。ただし、可変オブジェクトをセッションに配置している場合。アプリケーションが同期を処理する必要があります。

あなたの場合、if your Bean is Mutable i.e, has state. Yes it has to be thread safe.

テストケースについては、使用しているブラウザによって異なります。ほとんどのブラウザは、サーバーごとに最大 6 つの同時接続をサポートしています。ただし、Cookie がある場合に並列接続を使用するかどうかはわかりません。

于 2012-06-07T13:47:18.543 に答える