3

知られているように、サーブレットはそれぞれのリクエストに対して個別のスレッドを使用し、これによりサーバーの効率が向上します。一方、struts2 フレームワークでは、マップされた各Action-Classには、それぞれのrequests に対して作成された独自のオブジェクトがあります。

さて、通常のサーブレットの単なるスレッドと比較して、struts2 で個々のオブジェクトを持つことはどのように (最適化された) 良い習慣なのでしょうか? サーブレットだけでいいじゃないですか!?

4

1 に答える 1

5

When a request comes in to a web container, the container takes a thread from a pool in order to execute the request. Once the request is handled, the thread goes back to the pool to be usable for subsequent requests. Several requests can be handled in parallel, because the pool has several threads available.

Each servlet you declare in your web app is instantiated only once by the web container. A single instance of each servlet is thus used by several concurrent threads. This is why your servlets must be thread-safe.

Struts doesn't change anything to the above. What it does is that it defines a single servlet or filter that handles all the requests. And for each request targeting the path of a given action, a new Struts Action instance is created. This is where the model with servlets differ. A servlet is a singleton (only one instance for all the requests), whereas a new Struts action is instantiated for every request.

利点は、アクションがスレッドセーフである必要がないことです。これは、アクションが 1 つのスレッドによってのみ使用され、その後破棄されるためです。同期を必要とせずに中間状態を含めることができます。欠点は、多くのインスタンスが作成されることです。しかし、Java ガベージ コレクタは Struts アクションのような存続期間の短いオブジェクトを非常に高速にリサイクルするため、実際には問題は発生しません。

于 2012-11-02T22:28:28.563 に答える