2010-08-04 14 views
18

Soy bastante nuevo en el desarrollo web. Entonces me disculpo si esta es una pregunta muy básica. Por ejemplo, creo una aplicación web y la despliego a tomcat. Ahora, cuando varios usuarios acceden a la aplicación web, ¿Tomcat crea un nuevo hilo por usuario? Si ese es el caso, ¿puedo seguir creando subprocesos en mi aplicación y esperar que permanezca local en cada subproceso creado por tomcat? ¿Los datos del nivel de sesión permanecen sincronizados a través de los hilos?¿Tomcat crea un hilo por usuario?

espero que mi pregunta tiene sentido.

+2

Puede encontrar [esta respuesta] (http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909) útil también. – BalusC

Respuesta

35

Cada solicitud se trata en un hilo diferente. Esto no es un "hilo por usuario". Una solicitud es cualquier interacción del cliente (navegador web) y el servidor. Por lo tanto, escribiendo una Url en su navegador, invocando una solicitud de AJAX, cada uno se maneja en un hilo separado.

El estado que un usuario adquiere durante un 'inicio de sesión' (no tiene que ser un inicio de sesión per se; una mejor manera de decir que es un conjunto de solicitudes relacionadas por un usuario) se almacena convenientemente en sesión. Puede usar la sesión para almacenar cualquier información que sea aplicable al usuario, aunque debe tener cuidado de no almacenar demasiados datos porque consume memoria. El manejo de la sesión requiere un grado de habilidad.

Sí hay que tener mucho cuidado si a encender de nuevos temas; puedes romper cosas, y típicamente es una mala idea. Si debe hacer algo que llevará mucho tiempo, use JMS para manejar lo que sea de forma asíncrona. También recuerde que no todas las tareas que afectan los datos de la aplicación web deben invocarse desde la aplicación web. Una tarea que escanea los datos diariamente se puede ejecutar como una tarea separada dentro o fuera de tomcat, es decir, puede escribir un trabajo usando algo como el programador de cuarzo, o incluso escribir un programa separado y configurarlo para que se ejecute en un cron (sin embargo, hay que tener cuidado con el trabajo cambiando los datos de debajo de tu aplicación web).

Si está utilizando las mejores tecnologías como Spring e Hibernate, normalmente vinculan objetos (o pueden ser configurados por el desarrollador de la aplicación) que el programador necesitará para cada hilo (usando ThreadLocal de java).

Ésta es también una de las razones que comienzan sus propios hilos es peligroso. Si inicia su propio hilo, puede perder recursos que están vinculados al hilo inicial cuando finaliza la solicitud, y esto significa que si intenta acceder a esos recursos en su hilo de trabajo, no estarán disponibles. Este tipo de error puede ser un dolor en el culo para encontrar/corregir.

edición - como Stephen C señaló en un comentario para otra respuesta, es importante hacer notar que por lo general Tomcat (y otros recipientes) Mantener un grupo de subprocesos para su uso. Esto significa que un nuevo hilo no necesariamente se crea para cada solicitud. Esto significa que cada solicitud ejecuta en un hilo separado, que podría o no podría ser creada o reutilizado.

+1

Gracias por la respuesta detallada. Entonces, ¿cómo hace alguien tareas concurrentes en una aplicación web? ¿Generalmente se evita incluso si se puede obtener rendimiento de ella? – user377067

+2

¿Qué quiere decir con concurrente? Si una solicitud inicia una tarea que llevará mucho tiempo, debe manejarla de forma asincrónica. Usar JMS es la respuesta aquí. La idea es enviar un mensaje a una cola o tema (y la solicitud de iniciación de los extremos), y una de frijol (mensaje bean controlado) está configurado para ver la cola o tema y consumir los mensajes sobre el mismo, y hacer vez que algo consumir basado en el mensaje. Tendrás que buscarlo en Google para descubrir cómo implementarlo, pero no es difícil. – hvgotcodes

+0

Lo aprecio. – user377067

Cuestiones relacionadas