2016-01-25 2 views
0

Как я могу обучить Tomcat обслуживать один и тот же экземпляр сервлета из нескольких путей?Выполнение одного экземпляра сервлета с разных путей в Tomcat

Например, данные example.com/old-address и example.com/new-address, я хотел бы сохранить тот же экземпляр сервлета с этих двух адресов. Я не хочу разворачивать сервлет два раза. Возможно ли это с Tomcat автономно, без переписывания URL-адресов Apache HTTP/обратного прокси-сервера?

+0

Вы действительно заботитесь, действительно ли это тот же самый экземпляр сервлета (т. Е. Тот же объект), или вы просто хотите использовать тот же класс сервлета в том же webapp? Потому что, если это последний, просто объявите два отображения сервлетов в вашем веб-приложении. –

+0

@JBNizet, я хочу иметь один и тот же экземпляр по двум причинам: я не хочу излишнего потребления памяти. И два или более экземпляра сервлетов, обращающихся к одному экземпляру базы данных, могут вызвать конфликты в моем конкретном случае. – Abdull

+0

Экземпляр объекта занимает 16 байт памяти, поэтому я не думаю, что это действительная проблема. И даже если у вас только один экземпляр, он одновременно выполняет запросы, поэтому вы, скорее всего, ** уже ** обращаетесь к одной и той же базе данных одновременно. –

ответ

1

Есть много различных уровней, на которых можно ответить на этот вопрос:

  • Фактический сервлет экземпляра (как в смысле «экземпляр класса») не ваше дело: сам сервер приложений решает, сколько экземпляров объекта, который он хочет создать. (обычно это всего лишь 1 - за каждое приложение)
  • Если вы развертываете веб-приложение на корневом пути вашего сервера («/»), вы сможете сопоставить URL /old-address и /new-address с тем же сервлетом (опять же, don Не беспокойтесь о примере .Я предполагаю, что вы хотите развернуть old-address.war и new-address.war - в этом случае вы будете запускать совершенно разные веб-приложения, которые будут отделены от друг от друга по дизайну.
  • Если вы переходите от одного к другому имени приложения, на самом деле преимуществом является настройка правильных перенаправлений (постоянных переадресаций, если на то пошло), так что рано или поздно все обновили свои закладки и ссылки .

Комментарий к следующим примечаниям:

Сервлет не должен сохранять состояние в своем экземпляре. Запросы подаются одновременно, и государство приходит через объекты запроса и ответа. Если вы беспокоитесь о параллельном доступе к некоторым бэкэнд-ресурсам (как вы заявляете в комментарии к вопросу): у вас уже есть неправильная реализация, и им просто повезло, что они не были укушены ею. Даже один экземпляр сервлета может обрабатывать тысячи одновременных запросов (если контейнер принимает много параллельных соединений).

и потребление памяти сервлетов объекта также не имеет значения (см мой комментарий по этому поводу)

Вы волнуетесь о неверном вещи.

+0

Если я разворачиваю один и тот же сервлет дважды, вам потребуется дважды память одного экземпляра, верно? – Abdull

+1

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

0

Вы можете использовать сервлет-отображение в вашем web.xml, как это:

<servlet-mapping> 
    <servlet-name>yourServletName</servlet-name> 
    <url-pattern>/old-address</url-pattern> 
    <url-pattern>/new-address</url-pattern> 
</servlet-mapping> 

Элемент URL-шаблон может быть повторен произвольно внутри элемента сервлет-отображение.

Смежные вопросы