Подтвердить что ты не робот

Создает ли tomcat поток для пользователя?

Я новичок в веб-разработке. Поэтому я извиняюсь, если это очень простой вопрос. Например, я создаю веб-приложение и развертываю его в tomcat. Теперь, когда несколько пользователей попадают в веб-приложение, tomcat создает новый поток для каждого пользователя? Если в этом случае я могу по-прежнему создавать потоки в самом приложении и ожидать, что он останется локальным для каждого пользовательского потока, созданного tomcat? Сохраняются ли данные уровня сеанса по потокам?

Надеюсь, мой вопрос имеет смысл.

4b9b3361

Ответ 1

Каждый запрос обрабатывается в другом потоке. Это не "поток для пользователя". Запрос - это любое взаимодействие с клиентом (веб-браузером) и сервером. Итак, набрав Url в вашем браузере, вызывая запрос ajax, каждый из них обрабатывается в отдельном потоке.

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

Да, вы должны быть очень осторожны, если вы запускаете новые потоки; вы можете сломать вещи, и обычно это плохая идея. Если вы должны сделать что-то, что займет много времени, используйте JMS для обработки того, что он асинхронно. Также помните, что не все задачи, которые влияют на данные веб-приложения, должны вызываться из webapp. Задача, которая ежедневно сканирует данные, может быть запущена как отдельная задача в tomcat или из нее, то есть вы можете написать задание, используя что-то вроде кварцевого планировщика, или даже написать отдельную программу и настроить ее для запуска в cron (be тем не менее, осторожно выполняйте задание, изменяя данные из-под вас при помощи webapp).

Если вы используете лучшие в своем классе технологии, такие как Spring и Hibernate, они обычно связывают объекты (или могут быть настроены разработчиком приложения), которые программисту понадобятся для каждого потока (используя java ThreadLocal).

Это также одна из причин, почему ваши собственные потоки опасны. Если вы начнете свой собственный поток, вы можете потерять ресурсы, привязанные к первому потоку, когда запрос закончится, а это означает, что если вы попытаетесь получить доступ к этим ресурсам в рабочем потоке, они не будут доступны. Этот тип ошибки может быть болью в заднице, чтобы найти/исправить.

edit - как отметил Стивен С в комментарии к другому ответу, важно отметить, что обычно Tomcat (и другие контейнеры) поддерживают пул потоков для использования. Это означает, что новый поток не обязательно создается для каждого запроса. Это означает, что каждый запрос выполняется в отдельном потоке, который может быть или не быть создан или повторно использован.