Конфигурирование Tomcat для поднятия только одного сервлета на приложение - PullRequest
3 голосов
/ 04 августа 2009

Насколько я понимаю, Tomcat разрешено собирать столько копий сервлета, сколько ему нужно для обслуживания запросов.

Это заставляет мои сервлеты не иметь тяжеловесного состояния и вместо этого сохранять все состояния в (одиночном) контексте сервлета.

Можно ли настроить Tomcat так, чтобы он относился к моим сервлетам как к синглетам и всегда вызывал ровно один экземпляр сервлета независимо от нагрузки?

Ответы [ 4 ]

11 голосов
/ 04 августа 2009

Согласно спецификации сервлета, (v2.4, раздел 2.2 «Количество экземпляров»):

SRV.2.2 Количество экземпляров

Для сервлета, не размещенного в распределенной среде (по умолчанию), сервлет контейнер должен использовать только один экземпляр для объявления сервлета. Однако для сервлета реализуя интерфейс SingleThreadModel, контейнер сервлета может создание нескольких экземпляров для обработки тяжелой загрузки запросов и сериализации запросов в конкретном случае.

Ответ на ваш вопрос прост: не реализуйте SingleThreadModel и не объявляйте ваш сервлет несколько раз в web.xml файле дескриптора.

2 голосов
/ 04 августа 2009

Другая основная причина, по которой вы не хотите сохранять состояние в своем сервлете, заключается в том, что он вызывает проблемы с синхронизацией, проблемы сериализации, если вы хотите работать в кластерной среде, и т. Д. Все это просто избежать, если вы не хранить состояние внутри сервлета, а не там, где оно принадлежит объектам Session (или Request).

Так на самом деле ... почему вы хотите сохранить состояние? Это «рекомендуемая практика» по причине.

1 голос
/ 04 августа 2009

Так же Мэтт Б. Я однажды сильно обгорел, прежде чем усвоил этот урок. Я сохранил информацию о состоянии в статике в объекте сервлета. Все это отлично работало в тестировании, где у нас был один сервер. Затем мы развернули в производство, где у нас был кластер серверов, и мы получили действительно странные ошибки, прежде чем мы наконец выяснили это.

Используйте ваши объекты Session или Application. Вот для чего они.

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

1 голос
/ 04 августа 2009

Нет, я так не думаю. Однако на практике tomcat будет создавать только один сервлет, даже если спецификация JavaEE позволяет создавать несколько экземпляров. Большинство, если не все, инфраструктур MVC там полагаются на это предположение и хранят много состояния конфигурации в сервлете.

Если вы хотите избежать опасности, не храните свое состояние в сервлете, вставьте его в другой класс, использующий шаблон синглтона, и ссылайтесь на этот синглтон из вашего сервлета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...