Когда перейти на кеширование / кэш второго уровня? Любой практический сценарий со спецификой?

Я работаю над веб-приложением, принадлежащим производителю автомобилей, разработанным в Spring-Hibernate с базой данных MS SQL Server 2005.

С помощью этого приложения конечные пользователи могут запрашивать создание автомобилей, автобусов, грузовиков и т. Д. Через веб-интерфейсы. Когда пользователь входит в систему, отображается форма HTML для захвата технической спецификации автомобиля, например, если кто-то хотел запросить автомобиль, он может указать данные о модели / модели двигателя, шинах, шасси и т. Д. Всего существует 100 элементов формы. на экране "Создать запрос транспортного средства", из которых 30% представляют собой раскрывающиеся списки (поля "ВЫБОР") для отображения параметров (т. е. пользователи могут выбрать один из них) . Эти поля SELECT заполняются из значений, хранящихся в базе данных (основные данные) . Эти основные данные меняются не реже одного раза в неделю, запуская хранимую процедуру в серверной части.

В мире насчитывается около 10000 пользователей этого приложения, и самое большее мы ожидаем 5000 обращений в день по запросу нового транспортного средства, т.е. 5000 раз будет отображаться форма создания автомобиля.

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

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

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

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

2 ответа

Решение

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

Вам не нужно, но вы могли бы. И и данные только для чтения (или в основном для чтения), такие как неизменяемые справочные данные (страны, штаты, налоговые коды или, в вашем случае, Engine, Tire, Chassis и т. Д.) Являются идеальными кандидатами для кэширования второго уровня (и кэширования запросов, если требуется).).

Поскольку эти значения отображаются из набора основных таблиц, которые будут меняться только раз в неделю, я думаю, что кэширование основных данных поможет повысить производительность,

Ну, в зависимости от того, какое оборудование, размер вашего кластера и т. Д., Ваше приложение может просто справиться с нагрузкой. Но, как я уже писал, очень часто кешируются данные только для чтения:

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

Просто помните, что кэширование вещей означает, что их объектное представление не будет собирать мусор, поэтому это может немного увеличить потребность в памяти.

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

Честно говоря, вы не должны ждать, пока производство, чтобы увидеть, если есть проблемы с производительностью. Прежде чем загружать или подвергать стресс-тестированию приложение в специализированной среде, необходимо настроить приложение, JVM, сервер приложений, базу данных и т. Д. И не забывайте, что вы не можете улучшить то, что не можете измерить.

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

Это не так сложно. Вам необходимо активировать кэширование второго уровня и кэширование запросов в конфигурации Hibernate и выбрать поставщика кэширования. Я рекомендую использовать EhCache, и соответствующие свойства:

hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider

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

И если вы решите использовать кэш второго уровня, вам придется его вручную удалять, поскольку вы не обновляете данные через Hibernate API, а используете хранимую процедуру (с evict методы на SessionFactory). Это потребует несколько строк кода. Если это возможно, перезапуск вашего приложения был бы другим вариантом.

5000 посещений в день звучат как трафик, но имейте в виду, что это всего 3 с половиной попадания в минуту. Предполагая, что ваша база данных может выполнить все запросы, необходимые для отображения страницы менее чем за пару сотен миллисекунд, вы, вероятно, в порядке.

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

Другие вопросы по тегам