2010-08-04 15 views
18

io sono abbastanza nuovo per lo sviluppo web. Quindi mi scuso se questa è una domanda molto semplice. Ad esempio, creo un'applicazione web e la distribuisco a tomcat. Ora quando più utenti colpiscono l'applicazione Web, Tomcat crea una nuova discussione per utente? Se questo è il caso, allora posso comunque creare discussioni nella mia applicazione stessa e si aspettano di rimanere locale per ogni thread utente creato da Tomcat? I dati a livello di sessione rimangono sincronizzati tra thread?Tomcat crea una discussione per utente?

Spero che la mia domanda abbia un senso.

+2

Si possono trovare [questa risposta] (http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909) utile pure. – BalusC

risposta

35

Ogni richiesta viene gestita in un thread diverso. Questo non è un "thread per utente". Una richiesta è qualsiasi interazione dal client (browser Web) e dal server. Quindi, digitando un URL nel tuo browser, invocando una richiesta Ajax, ognuno viene gestito in un thread separato.

Lo stato che un utente acquisisce durante un 'accesso' (non deve essere un accesso di per sé, un modo migliore per dire che è "un insieme di richieste correlate da parte di un utente") è comodamente memorizzato nel sessione. È possibile utilizzare la sessione per memorizzare tutti i dati che è applicabile per l'utente, anche se si deve stare attenti a non archiviare troppi dati perché si mangia la memoria. La gestione delle sessioni richiede un certo grado di abilità.

Sì, è necessario essere molto attenti se a fare fuoco fuori nuove discussioni; puoi rompere le cose, e tipicamente è una cattiva idea. Se devi fare qualcosa che richiederà molto tempo, usa JMS per gestire qualsiasi cosa sia in modo asincrono. Ricorda inoltre che non tutte le attività che riguardano i dati delle applicazioni web devono essere richiamate dall'app web. Un'attività che esegue la scansione giornaliera dei dati può essere eseguita come attività separata all'interno o all'esterno di tomcat, ovvero è possibile scrivere un lavoro utilizzando qualcosa come il programma di pianificazione quarziani, o anche scrivere un programma separato e configurarlo per l'esecuzione in un cron (be attento al lavoro che cambia i dati da sotto la tua webapp, però).

Se si utilizzano tecnologie best of breed come Spring e Hibernate, in genere collegano gli oggetti (o possono essere configurati dallo sviluppatore dell'app) che il programmatore necessiterà per ciascun thread (utilizzando ThreadLocal di java).

Questo è anche uno dei motivi per iniziare la propria discussioni è pericoloso. Se inizi il tuo thread, potresti perdere risorse che sono legate al thread iniziale quando la richiesta termina, e questo significa che se provi ad accedere a quelle risorse nel tuo thread di lavoro non saranno disponibili. Questo tipo di bug può essere un rompicapo da trovare/risolvere.

modifica - come Stephen C ha sottolineato in un commento per un'altra risposta, è importante notare che in genere Tomcat (e altri contenitori) gestiscono un pool di thread da utilizzare. Ciò significa che un nuovo thread non viene necessariamente creato per ogni richiesta. Ciò significa che ogni richiesta eseguito in un thread separato, che può o non può essere creato o riutilizzata.

+1

Grazie per la risposta dettagliata. Come fa qualcuno a svolgere attività simultanee in un'app Web? Viene generalmente evitato anche se è possibile ottenere prestazioni da esso? – user377067

+2

Cosa intendi per concurrent? Se una richiesta avvia un'attività che richiederà molto tempo, è necessario gestirla in modo asincrono. Usare JMS è la risposta qui. L'idea è di inviare un messaggio ad una coda o ad un argomento (e la richiesta di avvio termina) e un bean (message driven bean) è configurato per guardare la coda o l'argomento e consumare i messaggi su di esso, e fare qualcosa in termini di tempo basato su il messaggio. Avrai bisogno di google per scoprire come implementarlo, ma non è difficile. – hvgotcodes

+0

Lo apprezzo. – user377067

Problemi correlati