Я работаю над разработкой веб-приложения для 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-го уровня используется ОДИН РАЗ для каждого приложения. разве это не ложь? Разве он не используется ОДИН РАЗ в SessionFactory
? и: несколько sessionfactorys = возможно несколько кэшей 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) что-нибудь еще, что может быть перепутано с использованием упомянутых кешей? :-)
Спасибо за ответ, независимо от того, какой вопрос! :-)