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

Im работает над разработкой веб-приложения с 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) кэширование метода не связано с hibernate кэширование

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

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

Getting mixed up

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

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

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

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

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 не будет беспокоить его недействительность (или он не будет делать это так часто). Но кэш только для чтения (только для чтения), конечно, запретит любые новинки.

в чем разница между кэшем запросов и кэшем 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.

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

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


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

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

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