Różnica między każdą instancją servleta A każdym wątkiem servleta w servletach? [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak działają serwlety? Tworzenie instancji, sesje, współdzielone zmienne i wielowątkowość (8 odpowiedzi) Zamknięty 5 lat temu .

Czy istnieje wiele instancji klasy servlet? Jak słyszę " każda instancja servleta" Czy ktoś może to rozwinąć?

Author: Ashwin, 2010-02-02

6 answers

Kiedy kontener Servleta się Uruchamia, to:

  1. czyta web.xml;
  2. znajduje zadeklarowane serwlety w classpath; oraz
  3. ładuje i tworzy instancje każdego Servletu tylko raz .

Mniej więcej tak:

String urlPattern = parseWebXmlAndRetrieveServletUrlPattern();
String servletClass = parseWebXmlAndRetrieveServletClass();
HttpServlet servlet = (HttpServlet) Class.forName(servletClass).newInstance();
servlet.init();
servlets.put(urlPattern, servlet); // Similar to a map interface.

Te serwlety są przechowywane w pamięci i ponownie używane za każdym razem, gdy adres URL żądania pasuje do skojarzonego z Serwletem url-pattern. Następnie kontener servleta wykonuje kod podobny do:

for (Entry<String, HttpServlet> entry : servlets.entrySet()) {
    String urlPattern = entry.getKey();
    HttpServlet servlet = entry.getValue();
    if (request.getRequestURL().matches(urlPattern)) {
        servlet.service(request, response);
        break;
    }
}

The GenericServlet#service() on its turn decisions który z doGet(), doPost(), itd.. wywoływać na podstawie HttpServletRequest#getMethod().

Widzisz, servletcontainer używa ponownie tej samej instancji servleta dla każdego żądania. Innymi słowy: serwlety są dzielone pomiędzy każde żądanie. Dlatego niezwykle ważne jest, aby pisać kod servleta w sposób threadsafe-co jest w rzeczywistości proste: po prostu Nie przypisuj dane o zasięgu żądania lub sesji jako zmienne instancji servleta, ale tylko jako zmienne lokalne metody. Np.

public class MyServlet extends HttpServlet {

    private Object thisIsNOTThreadSafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    } 
}
 187
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-15 01:47:55

Nie, jest tylko jedna instancja servletu, która jest ponownie używana dla wielu żądań od wielu klientów. Prowadzi to do dwóch ważnych zasad:

  • nie używaj zmiennych instancji w serwlecie, z wyjątkiem wartości dla całej aplikacji, najczęściej uzyskiwanych z parametrów kontekstowych.
  • nie twórz metod synchronized w serwletie

(to samo dotyczy filtrów serwletów i JSP)

 31
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-03 11:38:54

Zgodnie ze specyfikacją Java Servlet w wersji 3.0 (str. 6-7), na JVM będzie jedna instancja na deklarację, chyba że servlet implementuje Model Single Threadmodel, w którym to przypadku może być wiele instancji na JVM.

 11
Author: Samuel Edwin Ward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-12 17:04:50

Chociaż jest już kilka dobrych odpowiedzi, żadna z nich nie mówiła o aplikacji internetowej Java wdrożonej w środowisku rozproszonym. Jest to praktyczny scenariusz, w którym w rzeczywistości tworzy się wiele instancji pojedynczego servletu. W środowisku rozproszonym masz klaster maszyn do obsługi żądania i żądanie może przejść do dowolnej z tych maszyn. Każda z tych maszyn powinna być w stanie obsłużyć żądanie, a zatem każda maszyna powinna mieć instancję twojego MyAwesomeServlet in it ' s JVM.

Tak więc, poprawną instrukcją byłoby to, że na JVM jest tylko jedna instancja dla każdego servletu, chyba że implementuje SingleThreadModel.

SingleThreadModel w prostych słowach mówi, że musisz mieć tylko jeden wątek na instancję Servletu, więc zasadniczo musisz utworzyć jedną instancję na nadchodzące żądanie, aby go obsłużyć, co zasadniczo zabija całą koncepcję obsługi żądań w sposób równoległy i nie jest uważane za dobrą praktykę jako servlet tworzenie i inicjalizacja obiektu zajmuje trochę czasu, zanim będzie gotowy do przetworzenia żądania.

 6
Author: Saurabh Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-18 12:35:29

Nie może być wiele instancji klasy servlet. Nawet jeśli istnieje jedna instancja servletu, jest on w stanie obsłużyć wiele żądań. Dlatego mądrze jest nie używać zmiennych poziomu klasy.

 5
Author: fastcodejava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-21 04:33:45

Dla tych, którzy znają JavaScript (a nie tylko jego bibliotekę), serwlety mogą być wyświetlane jako obiekty funkcyjne . Jako obiekty funkcjonalne, ich głównym zadaniem jest zrobienie czegoś , zamiast przechowywanie informacji w swoich skrzyniach. Nie ma potrzeby tworzenia instancji więcej niż jednej instancji każdego takiego obiektu funkcjonalnego, z tym samym uzasadnieniem, że metody klasy Java są współdzielone między wszystkimi instancjami tej klasy.

 4
Author: lcn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-19 02:31:06