« WindowsとLinuxインストールが早いのはどっち | メイン | Ubuntu Linux をインストールした »

StrutsのActionがスレッドセーフでない証拠

検索キーワードを見ていると相変わらずStrutsのActionがスレッドセーフであるか否かを探していると見られるものが多い。

最近出たStruts2は知らんが、Struts1.x系においては一度作ったActionインスタンスはアプリケーションサーバー(Tomcat等)を再起動するまではずーとプールされる。

ためしにこんなコードをActionクラスのexecuteに入れてみれば一発だ。

System.out.println(this.hashCode());

なんどリロードしてもハッシュコードは一緒。つまり同一インスタンスなので読取専用以外のフィールドは持たせないほうがよいということになる。ユーザー固有の情報(たとえばHttpSessionなど)をフィールドにもたせてActionクラスを作ってしまうと自分一人のテストでは問題が発覚しなくても、結合テスト時などの複数人同時に利用したときに問題が発覚して大慌てになるので注意。

Actionがスレッドセーフでない理由はパフォーマンス的にリクエスト毎にActionをnewするのはよろしくないという設計者の思想があるからしょうがない。

ActionをスレッドセーフにするためにSpringなどのDIコンテナを利用してActionインスタンスをリクエスト固有で生成するようにしていたやり方もある。

トラックバック

このエントリーのトラックバックURL:
http://rutake.ddo.jp/blog/mt-tb.cgi/72

この一覧は、次のエントリーを参照しています: StrutsのActionがスレッドセーフでない証拠:

» StrutsのActionがスレッドセーフでない理由 送信元 雪山愛好家の日記
あまりにコアなネタなので別ブログに書いておきました。 技術メモ [詳しくはこちら]

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2007年07月13日 12:55に投稿されたエントリーのページです。

ひとつ前の投稿は「WindowsとLinuxインストールが早いのはどっち」です。

次の投稿は「Ubuntu Linux をインストールした」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。