Будет ли Tomcat 6 кэшировать веб-приложения?

Будет ли Tomcat 6 кэшировать веб-приложения?

У меня есть сервер Tomcat 6 на сервере Ubuntu 12.04 с 4 ГБ и следующими JAVA_OPTS

JAVA_OPTS="-Djava.awt.headless=true -Xms512M -Xmx512M -XX:PermSize=1024M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"

Глупый вопрос: если я разверну одно и то же веб-приложение (один и тот же файл war) несколько раз (каждый из которых будет ссылаться на другую базу данных Postgres) — как server.com:8080/webapp1 server.com:8080/webapp2 и т. д.

Могу ли я предположить, что Tomcat будет кэшировать файлы классов один раз для нескольких веб-приложений? Или - Tomcat кэширует классы для каждого веб-приложения?

Спасибо заранее, Дэнни.

решение1

Ответ зависит от того, где вы разместили файл(ы) классов, используемые вашим веб-приложением.

Если вы поместите заданный класс в путь загрузчика классов Tomcat Common $CATALINA_HOME/lib, он будет доступен всем веб-приложениям. То же самое касается его кэшированной формы.

Если вы используете путь загрузчика классов веб-приложения Tomcat webapps/веб-приложение/WEB-INF/классы и веб-приложения/веб-приложение/WEB-INF/lib классы и соответствующие кэши классов изолированы между приложениями.

Техническое образование

Tomcat не соответствует изначальному способу обработки классов Java, а использует собственный загрузчик классов Java. Это необходимо для реализации ряда функций, связанных с:

  • обработка классов в веб-приложении
  • кэширование классов на веб-приложение
  • предварительная загрузка и повторная загрузка классов при запуске/выполнении веб-приложения
  • безопасность при загрузке/ссылке на классы

Пользовательский загрузчик классов Tomcat использует загрузчики классов Bootstrap, Extension и System по умолчанию для Java, но заменяет переменную classpath, используемую загрузчиком классов System, на свой собственный classpath. Это имеет следующий эффект:

  • замена механизма переопределения одобренных стандартов, поставляемого с Java, на собственный механизм Tomcat.
  • добавление двух дополнительных загрузчиков классов в конец иерархии загрузки классов Java:

    • Загрузчик классов Tomcat Common
    • Отдельный загрузчик классов для каждого веб-приложения

Исходный classpath игнорируется Tomcat.

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

Все классы, загруженные загрузчиком классов Common, становятся общедоступными для всех веб-приложений, включая кэш. Обширное размещение классов в пути загрузчика классов Common не рекомендуется, поскольку это:

  • нарушает переносимость
  • Требования к версии класса могут различаться для Tomcat и различных веб-приложений.
  • становится проблемой обслуживание: какой класс к чему принадлежит?

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

Сжатая версия была написана кем-то наэтотстраница.

Связанный контент