2010-11-22 11 views
2

ねえ、マルチスレッドに関する質問があります。まず、DispatcherServlet/DispatcherPorletのインスタンスはいくつありますか?それは常に唯一のものですか? 1秒間に10件のリクエストがあったとしても?デフォルトでシングルトンであるサービスはどうでしょうか?もし、検証のための検証サービスを提供するためにhandlerに注入されたvalidationService beanがシングルトン(デフォルト)であれば、それはシングルトンであり、場合によっては再インスタンス化されないという事実に頼ることができますか?高負荷のスプリングシングルトンビーンズ

答えて

0

これは興味深い質問です。

this previous questionで説明したように、コンテナは1つのサーブレットインスタンスのインスタンス化のみが許可されています。この場合、1つのスプリングコンテキストと1つのシングルトンが保証されます。

以前のバージョンのServlet仕様では何が起こるのですか。この動作を明示的に指定するのは不確実です。

実際には、コンテナは1つのサーブレットインスタンスをインスタンス化するだけです。したがって、1つのアプリコンテキストのみを取得すると仮定することは安全です。

+0

TomcatがSingletonサーブレットのインスタンスをインスタンス化することは知っていましたが、Jetty以外のものは一度も使用していませんでした。 – lisak

0

負荷に応じて、サーブレットコンテナは、サーブレットインスタンスの数を作成し、開発者はそのを制御することはできません。しかし、ほとんどの場合、コンテナは各サーブレットの単一のインスタンスを維持します(サーブレットはスレッドセーフであるはずです)。

豆は、Webアプリケーションごとに1つのシングルトンです。つまり、Springアプリケーションコンテキストはサーブレットコンテキストに格納されます(WebApplicationContextUtils.getWebApplicationContext(ServletContext)でアクセスできます)。

信頼性について:はい、1つのSpringアプリケーションコンテキストのスコープでには、各シングルトンBeanのインスタンスが1つしかないことに頼っている

+0

しかし、ここでは衝突があります。サーブレットコンテナが負荷の高いインスタンスを多数作成する場合、シングルトンDispactherServletへの参照を持つか、DispatcherServletのインスタンスが各コンテナサーブレットに対して作成され、 DispatcherServlet afaik(別途想像することはできません)ごとにハンドルがなければ可能です。ディスパッチャーサーブレットごとにハンドラがある場合、ハンドラと同じくらい多くのSpringアプリケーションコンテキストが必要です。 – lisak

+0

あなたは自分の応答を慎重に読んでいないようです。私はSpring ApplicationContext Per Servletインスタンスが1つあるとは言いませんでした。どれくらいのサーブレット・インスタンスがあるかにかかわらず、定義済みの異なるDispatcherServlet(2つ以上を定義できます)に関わらず、1つのコンテキスト当たりのWE WEB APPLICATIONがあります。 –

+0

実際には、Spring ApplicationContext PER SERVLET INSTANCEが1つあります(もちろんWebアプリケーション内にあります)。コンテナはシングルトンサーブレットにリクエストを委譲します。もちろん、複数のDispatcherを定義することはできますが、ディスパッチャを3つ定義するのではなく、1つのディスパッチャのインスタンスについて話しています...そして、常に1つのインスタンスしかありません – lisak