2010-11-22 4 views
2

Эй, у меня вопрос о многопоточности. Во-первых, сколько экземпляров DispatcherServlet/DispatcherPorlet существует? Всегда ли это единственный? Даже когда говорят 10 запросов в секунду? Что касается служб, которые по умолчанию являются одиночными. Если у меня есть компонент validationService, который вводится в обработчик для обеспечения проверки запроса, как одиночный (по умолчанию), могу ли я полагаться на тот факт, что он является синглом и что в некоторых случаях он не будет восстановлен?Весенние однополюсные бобы в высокой нагрузке

ответ

0

Это интересный вопрос.

Как указано в this previous question, контейнеру разрешается копировать только экземпляр сервлета. В этом случае у вас гарантирован один весенний контекст и один синглтон.

Вопрос в том, что происходит с предыдущими версиями спецификации сервлетов, которые я не уверен явно указывать это поведение явно.

На практике, однако, контейнеры только создавали экземпляр одного экземпляра сервлета - я никогда не видел, чтобы кто-то делал иначе. Поэтому можно с уверенностью предположить, что вы получите только один контекст приложения.

+0

Спасибо, я знал, что tomcat создает экземпляр экземпляра Singleton, но я никогда не использовал ничего, кроме Jetty, и мне нужно, чтобы приложение было портативным. – lisak

0

В зависимости от нагрузки контейнер сервлетов создает количество экземпляров сервлетов, разработчик не имеет никакого контроля над этим. Но в большинстве случаев контейнер поддерживает один экземпляр каждого сервлета (так как сервлеты должны быть потокобезопасными в любом случае).

Что касается весны singleton бобы, это одноточие для веб-приложения - контекст приложения Spring хранится в контексте сервлета (вы можете получить к нему доступ с WebApplicationContextUtils.getWebApplicationContext(ServletContext)).

Что касается надежности: да, вы можете положиться на то, что в области применения одного контекста приложения весны имеется только один экземпляр каждого одноэлементного компонента.

+0

Но вот столкновение, если контейнер сервлетов создает несколько экземпляров с высокой нагрузкой, они либо имеют ссылку на singleton DispactherServlet (что маловероятно), либо экземпляр DispatcherServlet создается для каждого сервлета Контейнера, если бы не было дескриптора для DispatcherServlet afaik (не можете представить себе иначе), и если есть обработчик для диспетчераServlet, должно быть столько контекстов приложения-приложения как обработчики – lisak

+0

Кажется, что вы не внимательно прочитали мой отзыв. Я не сказал, что есть одна Spring ApplicationContext PER SERVLET INSTANCE. Я сказал, что существует один контекст PER WEB APPLICATION, независимо от того, сколько экземпляров сервлетов существует или сколько разных DispatcherServlets вы определили (вы можете определить более одного). –

+0

На самом деле существует одна Spring ApplicationContext PER SERVLET INSTANCE (в рамках веб-приложения, конечно). Делегаты контейнеров обращаются к синглетному сервлету. Конечно, вы можете определить несколько диспетчеров, но мы говорим о экземплярах одного диспетчера, а не о трех диспетчерах ... И всегда есть только один экземпляр. – lisak

Смежные вопросы