Лучшее место для хранения больших данных, полученных с помощью Java-сервлета (Tomcat) - PullRequest
4 голосов
/ 02 сентября 2010

У меня есть сервлет Java, который извлекает данные из базы данных MySQL. Чтобы минимизировать обращения к базе данных, она извлекается только один раз в методе init () и помещается в HashMap <> (т.е. кэшируется в памяти).

На данный момент этот HashMap является членом класса сервлетов. Мне нужно не только сохранить эти данные, но также обновить некоторые значения (фактически счетчики) в кэшированных объектах базового класса значений hashmap. И есть таймер (или задача Cron), чтобы запланировать сброс этих счетчиков в БД.

Итак, после поиска в Google я нашел 3 варианта хранения кэшированных данных:

1) как сейчас, член класса сервлетов (но сервлеты могут быть выведены из строя и возвращены в эксплуатацию контейнером по желанию. Тогда данные будут потеряны)

2) в ServletContext (я прав, что здесь рекомендуется хранить небольшие объемы данных?)

3) в ресурсе JNDI .

Какой самый предпочтительный способ?

Ответы [ 4 ]

5 голосов
/ 02 сентября 2010

Поместите его в ServletContext Но используйте ConcurrentHashMap, чтобы избежать проблем параллелизма.

3 голосов
/ 02 сентября 2010

Из этих трех вариантов лучше всего хранить их в области приложения.Т.е. использовать ServletContext#setAttribute().Для этого вы хотели бы использовать ServletContextListener.В обычных сервлетах вы можете получить доступ к ServletContext унаследованным методом getServletContext().В JSP вы можете получить к нему доступ ${attributename}.

Если данные становятся слишком большими, так как они слишком много потребляют в памяти Java, вам следует рассмотреть 4-й вариант: использовать менеджер кэша.

2 голосов
/ 02 сентября 2010

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

1 голос
/ 03 апреля 2012

Если ваш кэш может стать достаточно большим, и вы часто обращаетесь к нему, будет разумно использовать какое-то решение для кэширования. Например, ehcache является хорошим кандидатом и легко интегрируется с приложениями Spring. Документация здесь .

Также проверьте этот обзор решений для кэширования с открытым исходным кодом для Java.

...