LINUX.ORG.RU

[java] Доступ к сервлету

 


0

1

Приложение состоит из сервлета и админки.
В сервлете есть HashMap, который заполняется при инициализации сервлета.
Как при определенных действиях в админке добавлять объекты в HashMap сервлета? Можно, конечно, сделать определенный запрос, на который сервлет вызовет метод обновления HashMap'а, но зачем обновлять весь HashMap, если надо добавить только 1 объект?
Можно передать объект в запросе к сервлету, подцепить параметры объекта из параметров и добавить в HashMap, но такой вариант мне кажется слишком уж костыльным...Как сделать проще?
Или сам факт постановки данной задачи уже говорит о кривой архитектуре?
Спасибо.

★★★★★

Хранить данные в сервлете нельзя, поскольку контейнер может его выгрузить в любой момент. Храни данные в сессии, например.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Видимо, не совсем корректно я выразился. Данные хранятся в БД. При инициализации сервлета они забираются из БД и хранятся в HashMap'е сервлета.

При работе с админкой в БД добавляются новые сущности. Как обновить HashMap сервлета, чтобы он соответствовал данным в базе?

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

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

dizza ★★★★★
()
Ответ на: комментарий от kovrik

Я бы сделал так.
При обработке запроса проверял появилось ли в БД что-то новое, если да то подгружал бы его. Плюс тут же бы сделал начальную инициализацию HashMap'a если он не инициализирован.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

так вот и вопрос - добавлять можно лишь обработкой запроса к сервлету?

Поясню: сервлет запускается в 1 экземпляре. Поэтому хотелось бы что-то наподобие такого (вызывать в любом месте в админке):
Servlet.getServlet().putSomethingToHashMap(int key, Object value);

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

Проще всего сделать класс-холдер твоего хешмепа. Как синглтон сделай его (хотя это зло, как правильно лень расписывать)

dizza ★★★★★
()
Ответ на: комментарий от dizza

Хорошо, сделаю я класс-холдер HashMap'а. В сервлет пришел запрос, нужно взять данные из HashMap'а - каждый раз дергать холдер? Как это скажется на производительности?

kovrik ★★★★★
() автор топика
Ответ на: комментарий от dizza

Понятно что твой вариант лучше, но это добавление нового слоя. Если приложение состоит из пары сервлетов то вряд ли это оправданно.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Если для двуз сервлетов уже приходится делать какие-то костыли, то выходит, что оправдано. Ты количество классов что ли экономишь? :)

dizza ★★★★★
()
Ответ на: комментарий от dizza

Нет :) Я только за верное решение. Просто оно не всегда оправданно в проектах типа «лабораторная работа». Как-то так.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Для лабы (подразумевается, что проект развиваться не будет) можно сделать public static переменную у сервлета и положить туда HashMap обернув его в Collections.synchronizedMap(). Вот тупое, простое, разовое решение.

dizza ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.