Синглтон сервлет?


1

Если я объявляю одноэлементно сервлет как

общественный статический класс SomeServlet расширяет HttpServlet {.....

Это дает ошибку, указывающую, что модификатор статическую гостей здесь не разрешены в NetBeans.

Пожалуйста, дайте мне знать, как создать сервлет Singleton, который позволяет выполнять только один клиент за раз.

Спасибо заранее, Mahes

+1

The единственный способ иметь Singleton Servlet - иметь одного пользователя. Достаточно. 22 фев. 092009-02-22 13:40:35

6
  • статический не имеет ничего общего с выполняется только одна нить в любой момент времени.
  • У вас могут быть статические классы как внутренние классы, но это не поможет вашей проблеме из-за первой точки.
  • Если я правильно помню, то создается только один сервлет, поэтому нет необходимости создавать синглтоны. Обновления: Я не помню правильно, как DefLog указал
  • для этого синхронизировать по методе (doGet, doPost, услуги или ваш метод реализации) обновления: не сделать трюк.

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

Обновление: см. Комментарии к этому вопросу, почему вы действительно не хотите падать за синхронизированный. Вы можете (например) хотеть иметь несколько сервлетов, получающих одну и ту же функциональность по одному. Кроме того, если вы синхронизируете уровень сервлета, вы столкнетесь с серьезными проблемами масштабирования. Это определенно неправильное место для решения проблем параллелизма.

  0

Синхронизация по методу может не обязательно работать, хотя это может заставить вас думать, что это так. 22 фев. 092009-02-22 12:12:07

  0

право - вот почему я добавил последний абзац. Я сомневаюсь, что ответ помогает решить коренную проблему. Это скорее реакция на предложенное решение. 22 фев. 092009-02-22 12:17:55

  0

(примечание: мой предыдущий комментарий был реакцией на Тома) 22 фев. 092009-02-22 12:18:47

  0

Неправильно, что экземпляр контейнера создается только одним экземпляром сервлета. Спецификация не требует его, даже если большинство контейнеров реализуют ее как таковую. Более контейнеры с тяжелым весом выделяют количество потоков в экземпляр и создают больше, если запросов больше. 22 фев. 092009-02-22 12:57:07

  0

благодарит за разъяснения. Я добавлю эту информацию в ответ ... 22 фев. 092009-02-22 13:29:41

+1

Хорошие обновления. :) 04 мар. 092009-03-04 00:06:40

+1

@DefLog: спецификация сервлета говорит, что контейнер должен создавать экземпляр только одного экземпляра сервлета для объявления (если сервлет не реализует интерфейс SingleThreadModel). 04 авг. 092009-08-04 18:23:58

+1

«Если я правильно напомню, что только один сервлет создан когда-либо» ... вы правы (обычно). См. Http://stackoverflow.com/questions/1228424/configuring-tomcat-to-only-raise-one-servlet-per-application/1228599#1228599 04 авг. 092009-08-04 19:01:41

  0

@OlafKock, я требую, чтобы этот ответ был переписан без создания каких-либо больше путаницы. Для новичков, подобных мне, будет полезно. Пожалуйста, сделайте это ради сообщества. 04 сен. 122012-09-04 05:03:50


1

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


3

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


0

Декларация высшего уровня никогда не может быть static. static означает, что элемент объявлен на уровне класса, поэтому ему требуется объявляющее объявление класса.

С сервлетами обычно будет один, но возможно больше экземпляров этого сервлета, которые обрабатывают запросы одновременно. Таким образом, возможно, вы действительно не хотите сокращать параллелизм на этом уровне, или используете фильтры сервлетов или фреймворк, например Spring Security, который может ограничить количество параллельных сеансов.


-3

Я склонен думать, что синглтоны злоупотребляют и часто указывают на недостаток базовой архитектуры решения. Предполагая, что вы сделали достаточно анализа, чтобы доказать, что вам нужен синглтон, вы можете использовать старый шаблон Singleton, который не полагается на статическую инициализацию.Вот пример:

public SomeServlet extends HttpServlet { 

    private instance = null; 

    private SomeServlet() { 
     // Construction code here 
    } 

    public synchronized SomeServlet getInstance() { 
     if(instance == null) { 
      instance = SomeServlet(); 
     } 
     return instance; 
    } 

    // Servlet methods here 

} 

Я вижу две потенциальные проблемы, хотя:

Во-первых, вы будете нуждаться в обертку Servlet (или, может быть, только цепь от другого сервлета, поскольку контейнер сервлетов не будет знать, как иметь дело с не имеющим закрытый конструктор.

во-вторых, вам все равно нужно синхронизировать методы сервлетов, потому что вы все еще не может гарантировать, что есть только один ИСПОЛНИТЕЛЬ нить «в» сервлета в то время.

  0

Возможно, вы захотите, чтобы Google дважды блокировала блокировку java 6. Он нашел это: http://www.ibm.com/developerworks/java/library/j-dcl.html 22 фев. 092009-02-22 15:53:01

  0

Отличная статья ... неприятные последствия для Java 6. Я почти полностью исключил шаблон Singleton из своего кода, но я обязательно запомню это для будущих обновлений. 23 фев. 092009-02-23 00:37:48

  0

Этот код действительно смущен. 04 мар. 092009-03-04 00:05:15

  0

Двойная проверка блокировки не нарушена в java 6. Цитата из http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java «С J2SE 5.0 эта проблема исправлена» 25 апр. 122012-04-25 15:20:08