2010-10-28 13 views
5

tengo una clase public class GAE_SERVLETREQUESTServlet extends HttpServlet {¿Debería un contenedor servlet crear una nueva instancia javax.servlet.http.HttpServlet para cada solicitud entrante?

No está seguro de lo que dice la especificación sobre el reciclaje de la HTTPServlet: En caso de que el contenedor de servlets crear una nueva instancia de esta clase en cada petición entrante o ¿pueden las clases de implementación de reutilización entre las peticiones?

Estoy investigando un problema divertido en el que parece que un Mapa creado en la instancia GAE_SERVLETREQUESTServlet mantiene el estado entre las solicitudes.

+0

¿El mapa está definido como una variable de instancia? – JoseK

+0

@JoseK: Sí, protegido (no estático). –

+1

Relacionado: http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables – BalusC

Respuesta

11

Para el caso general - no distribuido, multi-hilo, se garantiza que habrá sólo una instancia de la servlet. Desde el Servlet especificación 3.0:

2,1 Tratamiento de la petición Métodos

La interfaz básica Servlet define un método de servicio para el manejo de peticiones de cliente. Se invoca este método para cada solicitud que el contenedor de servlets enruta a una instancia de un servlet. El manejo de solicitudes concurrentes a una aplicación web generalmente requiere que los servlets de diseño del desarrollador web que pueden tratar con varios subprocesos que se ejecutan dentro del método de servicio en un momento determinado. Generalmente, el contenedor web maneja las solicitudes concurrentes al mismo servlet por ejecución concurrente del método de servicio en diferentes subprocesos.

2.2 Número de instancias

La declaración servlet que es o bien a través de la anotación como se describe en el Capítulo 8, “Anotaciones y enchufabilidad” o parte del descriptor de despliegue de la aplicación Web que contiene el servlet, como se describe en el Capítulo 14, "Implementación Descriptor", controla cómo el contenedor de servlets proporciona instancias del servlet. Para un servlet no alojado en un entorno distribuido (el valor predeterminado), el contenedor servlet debe usar solo una instancia por declaración de servlet. Sin embargo, para un servlet que implementa la interfaz SingleThreadModel, el contenedor de servlets puede instanciar instancias múltiples para manejar una pesada carga de solicitud y serializar las solicitudes a una instancia particular.

En el caso en que un servlet se desplegó como parte de una aplicación marcada en el descriptor de despliegue como distribuible, un recipiente puede tener una sola instancia por declaración servlet por la máquina virtual Java (JVM ™) 1. Sin embargo, si el servlet en una aplicación distribuible implementa la interfaz SingleThreadModel, el contenedor puede crear instancias múltiples de ese servlet en cada JVM del contenedor.

0

Si está guardando datos que son relevantes para cada usuario, debe almacenarlos en la sesión HTTP. Según lo declarado por skaffman, no almacene datos en la clase de servlet que espera sean diferentes para cada usuario. Aquí hay un ejemplo rápido.

 

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 ... 
    } 
} 
 
+0

No quiero almacenar el objeto en una sesión porque no tengo motivos para iniciar una cookie en el usuario, ni quiero almacenar datos de estado "por usuario" del lado del servidor. Este es un servicio de back-end y esa es la razón por la que comencé a buscar alternativas. He arreglado mi código ahora y francamente estoy un poco avergonzado de haber cometido un error de novato :) –

Cuestiones relacionadas