Должен ли контейнер сервлета создавать новый экземпляр javax.servlet.http.HttpServlet для каждого входящего запроса? - PullRequest
5 голосов
/ 28 октября 2010

У меня есть класс public class GAE_SERVLETREQUESTServlet extends HttpServlet {

Не уверен, что спецификация говорит об утилизации HTTPServlet: должен ли контейнер сервлета создавать новый экземпляр этого класса при каждом входящем запросе или же реализация может повторно использовать классы между запросами?

Я расследую забавную проблему, когда кажется, что карта, созданная в экземпляре GAE_SERVLETREQUESTServlet, поддерживает состояние между запросами.

Ответы [ 2 ]

11 голосов
/ 28 октября 2010

В общем случае - нераспределенный, многопоточный, гарантируется, что будет только один экземпляр сервлета.Из спецификации Servlet 3.0:

2.1 Методы обработки запросов

Базовый интерфейс Servlet определяет сервисный метод для обработки клиентских запросов.Этот метод вызывается для каждого запроса, который контейнер сервлета направляет к экземпляру сервлета.Для обработки одновременных запросов к веб-приложению обычно требуется, чтобы веб-разработчик разработал сервлеты, которые могут работать с несколькими потоками, выполняемыми в методе службы в конкретное время.Обычно веб-контейнер обрабатывает параллельные запросы к одному и тому же сервлету путем одновременного выполнения метода службы в разных потоках.

2.2 Число экземпляров

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

В случае, когда сервлет был развернут как часть приложенияпомеченный в дескрипторе развертывания как распространяемый, контейнер может иметь только один экземпляр на объявление сервлета на виртуальную машину Java (JVM ™) 1.Однако, если сервлет в распространяемом приложении реализует интерфейс SingleThreadModel, контейнер может создавать несколько экземпляров этого сервлета в каждой JVM контейнера.

0 голосов
/ 28 октября 2010

Если вы сохраняете данные, относящиеся к каждому пользователю, вы должны сохранить их в сеансе HTTP. Как заявляет skaffman, не храните данные в классе сервлетов, которые, как вы ожидаете, будут отличаться для каждого пользователя. Вот быстрый пример.


class MyServlet extends HttpServlet
{
    private Object ThisIsTheWrongPlaceToStorePerUserData;

    ... stuff ... doPut(HttpServletRequest httpRequest, ... more stuff ...)
    {
        Object iAmGood = new Object();
        HttpSession session = httpRequest.getSession(true);

        session.setAttribute("GoodPlaceToStorePerUserData", iAmGood);

        ... stuff ...
    }
}

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