Создает ли tomcat поток для каждого пользователя? - PullRequest
19 голосов
/ 04 августа 2010

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

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

1 Ответ

37 голосов
/ 04 августа 2010

Каждый запрос обрабатывается в отдельном потоке. Это не «поток на пользователя». Запрос - это любое взаимодействие со стороны клиента (веб-браузера) и сервера. Таким образом, набирая URL в вашем браузере, вызывая ajax-запрос, каждый обрабатывается в отдельном потоке.

Состояние, которое пользователь получает во время «входа в систему» ​​(само по себе это не обязательно должен быть вход в систему; лучший способ сказать, что это «набор связанных запросов одного пользователя») удобно сохраняется в сеансе , Вы можете использовать сеанс для хранения любых данных, которые применимы к пользователю, хотя вы должны быть осторожны, чтобы не хранить слишком много данных, потому что они расходуют память. Управление сессиями требует определенной квалификации.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...