Кеширование с Hibernate + Spring - некоторые вопросы! - PullRequest
62 голосов
/ 23 марта 2011

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

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

General

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

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

1st Level Cache

3) Кэш 1-го уровня является частью КАЖДОГО приложения Hibernate.

4) Кэш 1-го уровня создается для КАЖДОГО hibernate-сеанса.

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

2nd Level Cache

6) Я обнаружил: кэш 2-го уровня используется ОДИН РАЗ для каждого приложения. разве это не ложь? Разве это не используется ОДИН РАЗ в каждом сеансе? и: несколько параметров сеанса = возможно несколько кэшей 2-го уровня?

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

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

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

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

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

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

Query Cache

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

14) Для кэша запросов ДОЛЖЕН использоваться кэш 2-го уровня?

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

Spring

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

17) метод кэширования не связан с кэшированием в спящем режиме

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

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

Getting mixed up

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

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

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

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

Ответы [ 2 ]

74 голосов
/ 23 марта 2011

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

Да.

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

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

Кэш 1-го уровня является частью КАЖДОГО приложения Hibernate.

Да.

Кэш 1-го уровня создается для КАЖДОГО hibernate-сеанса.

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

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

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

Я узнал: кэш 2-го уровня используется ОДИН РАЗ для каждого приложения.разве это не ложь?Разве это не используется ОДИН РАЗ в каждом сеансе?и: несколько параметров сеанса = несколько возможных кэшей 2-го уровня?

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

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

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

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

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

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

См. выше.

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

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

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

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

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

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

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

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

Для кэша запросов ДОЛЖЕН использоваться кэш 2-го уровня?

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

где смысл в кеше Query и где его нет?

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

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

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

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

Spring не связано с Hibernate, поэтому ...

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 23 марта 2011

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

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

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

...