Кэширование с помощью Hibernate + Spring-некоторые вопросы!


Я работаю над разработкой веб-приложения с Spring 3 и Hibernate 3.6. На данный момент я пытаюсь понять, как работает кэширование с Spring и Hibernate. Я нашел некоторые источники о кэшировании с помощью Hibernate, а некоторые-о Spring, и теперь я пытаюсь собрать свою информацию. У меня все еще есть некоторые вопросы к обеим фреймворкам, и я буду рад, если кто-то сможет ответить на них или сказать мне, правильны ли факты, перечисленные здесь.

большую часть времени короткие ответы (Да/нет) будут достаточный. Я думаю, что этот список может быть полезен и для других, кто хочет понять, как работает кэширование с spring и hibernate.

General

1) Hibernate поддерживает следующие кэши: кэш 1-го уровня, кэш 2-го уровня, кэш запросов

2) сама Spring поддерживает следующие возможности кэширования: просто метод кэширования

1st Level Cache

3) кэш 1-го уровня является частью Каждое приложение Hibernate.

4) кэш 1-го уровня создается для каждого сеанса гибернации.

5) что сохраняется в кэше 1-го уровня? Объекты или просто значения их свойств? запросы и их результаты?

2nd Level Cache

6) я узнал: кэш 2-го уровня используется один раз для каждого приложения. разве это не ложь? разве он не используется один раз в sessionfactory? и: несколько sessionfactorys = возможно несколько кэшей 2-го уровня?

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

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

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

10) когда значения объекта меняется, как я могу обновить кэш 2-го уровня? флаш? могу ли я просто обновить часть кэша или должен быть обновлен весь кэш?

11) где кэш 2-го уровня имеет смысл, а где нет?

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

Query Cache

13) в чем разница между кэшем запросов и кэшем 2-го уровня? на мой взгляд: в кэше запросов сохраняются результирующие наборы, но не с их значениями, А только с их идентификаторами. когда запрос используется снова и результирующий набор остается "правильно", значения, принадлежащие идентификаторам, запрашиваются из кэша 2-го уровня

14) для кэша запросов должен использоваться кэш 2-го уровня?

15) где кэш запросов имеет смысл, а где нет?

Spring

16) предоставляет ли Spring больше возможностей кэширования, чем метод кэширования?

17) метод кэширования не связан с гибернацией кэширование

18) но: для кэширования метода необходим 2-й уровень, например ehcache (который также может использоваться hibernate)

19) можно ли использовать кэширование методов без запросов к базе данных?

Getting mixed up

20) если вы используете ehcache для hibernate в качестве кэша 2-го уровня и Ehcache для spring для кэширования методов, могу ли я использовать тот же экземпляр ehcache? есть ли шанс, что что-то смешивается вверх?

21) при использовании кэша 1-го уровня и кэша 2-го уровня, Могут ли они перепутаться? при запросе базы данных, откуда тогда берется результат, кэш 1-го или 2-го уровня? работает ли кэш 1-го уровня с кэшем 2-го уровня?

22) что-нибудь еще, что может быть перепутано с помощью кэшей, о которых я упоминал? : -)

Спасибо за ответ, не важно, какой вопрос! : -)

2 59

2 ответа:

Hibernate поддерживает следующие кэши: кэш 1-го уровня, кэш 2-го уровня, кэш запросов

да.

сама Spring поддерживает следующие возможности кэширования: просто метод кэширования

Spring 3.1 представляет новую абстракцию кэширования, основанную на аннотациях вокруг методов, да.

кэш 1-го уровня является частью каждого спящего режима приложение.

да.

кэш 1-го уровня создается для каждого сеанса гибернации.

да, хотя вы можете вручную очистить ее в любой момент.

что сохраняется в кэше 1-го уровня? Объекты или просто значения их свойств? запросы и их результаты?

это карта всех объектов, извлеченных в течение жизни сеанса, если вы загружаете один и тот же объект по идентификатору для второго время, он будет загружен с L1.

я узнал: кэш 2-го уровня используется один раз для каждого приложения. разве это не ложь? разве он не используется один раз в sessionfactory? и: несколько sessionfactorys = несколько кэшей 2-го уровня возможно?

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

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

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

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

вы не управляете L2 вручную, это происходит автоматически.

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

см. выше.

когда значения объекта меняется, как я могу обновить кэш 2-го уровня? флаш? могу ли я просто обновить часть кэша или должен быть весь кэш обновлено?

смотрите выше-Hibernate поймет это для вас. Вы никогда не взаимодействуете с L2 напрямую.

где кэш 2-го уровня имеет смысл, а где нет?

измерения. В приложении, которое считывает много данных по первичному ключу и коэффициент чтения-записи очень высок, L2 оказывает значительное влияние на вашу производительность.

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

режим кэша помогает Hibernate выбрать лучшую стратегию для кэширования и аннулирования. Например, если кэш доступен только для чтения, Hibernate не будет беспокоиться о его недействительности (или он не будет делать это так часто). Но кэш только для чтения (read only entity), конечно, запретит любые новинки.

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

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

для кэша запросов должен использоваться кэш 2-го уровня?

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

где кэш запросов имеет смысл, а где нет?

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

предоставляет ли Spring больше возможностей кэширования, чем кэширование методов?

нет, Весна более-менее просто клей для вашего собственного кода.

метод кэширования не связан с hibernate кэширования.

весна не связана с гибернацией, так что...

но: для кэширования метода необходим 2-й уровень, например ehcache (который можно использовать по hibernate тоже)

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

можно ли использовать кэширование методов без запросов к базе данных?

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

при использовании ehcache для гибернации в качестве 2-го кэш уровня и ehcache для spring для кэширования методов, могу ли я использовать один и тот же экземпляр ehcache? есть ли шанс, что что-то смешалось?

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

при использовании кэша 1-го уровня и кэша 2-го уровня, Могут ли они перепутаться? при запросе базы данных, откуда же тогда берется результат, кэш 1-го или 2-го уровня? работает ли кэш 1-го уровня с кэшем 2-го уровня?

Они просто работают, пока какая-то абстракция не утечет: -). При запросе по первичному ключу сначала проверяется L1 (это быстрее), затем L2.

что-нибудь еще, что может быть перепутано с помощью кэшей, о которых я упоминал? : -)

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

Что касается Spring и кэша второго уровня, есть классный проект с открытым исходным кодом, который может HEL spring работать с 2L cache:

например: http://code.google.com/p/ehcache-spring-annotations/

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