Кто-нибудь может объяснить простыми словами, что такое кэширование первого и второго уровня в Hibernate?
источник
Кто-нибудь может объяснить простыми словами, что такое кэширование первого и второго уровня в Hibernate?
1.1) Кэш первого уровня
Кэш первого уровня всегда ассоциируется с объектом Session . Hibernate использует этот кеш по умолчанию. Здесь он обрабатывает одну транзакцию за другой, что означает, что не будет обрабатывать одну транзакцию много раз. В основном это уменьшает количество SQL-запросов, которые необходимо сгенерировать в рамках данной транзакции. То есть вместо обновления после каждой модификации, выполненной в транзакции, она обновляет транзакцию только в конце транзакции.
1.2) Кэш второго уровня
Кэш второго уровня всегда ассоциируется с объектом Session Factory . Во время выполнения транзакций между ними загружаются объекты на уровне фабрики сеансов, так что эти объекты будут доступны для всего приложения, а не для одного пользователя. Поскольку объекты уже загружены в кэш, всякий раз, когда объект возвращается запросом, в это время не нужно переходить к транзакции базы данных. Таким образом, работает кэш второго уровня. Здесь мы также можем использовать кеш уровня запросов.
Цитируется по адресу: http://javabeat.net/introduction-to-hibernate-caching/
В блоге Streamline Logic есть довольно хорошее объяснение кеширования первого уровня .
По сути, кэширование первого уровня происходит отдельно для каждого сеанса, тогда как кэширование второго уровня может совместно использоваться несколькими сеансами.
источник
Вот некоторые основные объяснения кибер-кэша ...
Кэш первого уровня связан с объектом «сеанс». Область действия объектов кэша имеет сессию. Как только сессия закрыта, кэшированные объекты исчезают навсегда. Кэш первого уровня включен по умолчанию, и вы не можете его отключить. Когда мы запрашиваем объект в первый раз, он извлекается из базы данных и сохраняется в кэше первого уровня, связанном с сеансом гибернации. Если мы снова запросим тот же объект с тем же объектом сеанса, он будет загружен из кэша, и никакой SQL-запрос не будет выполнен. Загруженный объект может быть удален из сеанса с использованием
evict()
метода. Следующая загрузка этой сущности снова вызовет базу данных, если она была удалена с помощьюevict()
метода. Весь кэш сеанса можно удалить с помощьюclear()
метода. Это удалит все сущности, хранящиеся в кеше.Кэш второго уровня отличается от кэша первого уровня, который доступен для глобального использования в области фабрики сеансов. Кэш второго уровня создается в области фабрики сеансов и доступен для использования во всех сеансах, которые создаются с использованием этой конкретной фабрики сеансов. Это также означает, что после закрытия фабрики сеансов весь кэш, связанный с ним, умирает, а менеджер кеша также закрывается. Всякий раз, когда сеанс гибернации пытается загрузить объект, самое первое место, где он ищет кэшированную копию объекта в кэше первого уровня (связан с конкретным сеансом гибернации). Если кэшированная копия объекта присутствует в кэше первого уровня, она возвращается как результат метода загрузки. Если в кэше первого уровня нет кэшированной сущности, то для кэшированной сущности ищется кэш второго уровня. Если кэш второго уровня имеет кешированную сущность, он возвращается как результат метода load. Но, перед возвратом объекта он также сохраняется в кэше первого уровня, так что при следующем вызове метода загрузки для объекта объект будет возвращен из самого кэша первого уровня, и больше не потребуется возвращаться в кэш второго уровня. Если объект не найден в кэше первого уровня и кэше второго уровня, то выполняется запрос к базе данных, и объект сохраняется на обоих уровнях кэша, а затем возвращается как ответ
load()
метод.источник
Кэш первого уровня
Hibernate пытается отложить сброс постоянства контекста до последнего возможного момента. Как я объяснил в этой статье , эта стратегия традиционно известна как транзакционная обратная запись.
Перезапись в большей степени связана с сбросом Hibernate, а не с какой-либо логической или физической транзакцией. Во время транзакции сброс может происходить несколько раз.
Сброшенные изменения видны только для текущей транзакции базы данных. Пока текущая транзакция не будет зафиксирована, другие параллельные транзакции не видят изменений.
Благодаря кешу первого уровня, Hibernate может выполнять несколько оптимизаций:
Кэш второго уровня
Правильное решение для кэширования должно охватывать несколько сеансов Hibernate, и именно поэтому Hibernate также поддерживает дополнительный кэш второго уровня.
Кэш второго уровня связан с жизненным циклом SessionFactory, поэтому он уничтожается только при
SessionFactory
закрытии (как правило, когда приложение закрывается). Кэш второго уровня в основном ориентирован на сущности, хотя также поддерживает дополнительное решение для кэширования запросов.Для более подробной информации, проверьте эту статью .
источник
по умолчанию NHibernate использует кэширование первого уровня, основанное на объекте сеанса. но если вы работаете в многосерверной среде, то кэш первого уровня может не очень масштабироваться вместе с некоторыми проблемами с производительностью. это происходит из-за того, что приходится совершать очень частые поездки в базу данных, поскольку данные распределяются по нескольким серверам. другими словами, NHibernate предоставляет базовую, не очень сложную внутрипроцессную кэш-память L1 из коробки. Однако он не предоставляет функций, которые решение для кэширования должно оказывать заметное влияние на производительность приложения.
поэтому все эти проблемы связаны с использованием кэша L2, который связан с объектами фабрики сеансов. это сокращает длительные поездки в базу данных, что в конечном итоге увеличивает время отклика приложения.
источник
Кэш первого уровня
Объект Session содержит данные кэша первого уровня. Это включено по умолчанию. Данные кэша первого уровня не будут доступны всему приложению. Приложение может использовать много объектов сеанса.
Кэш второго уровня
Объект SessionFactory содержит данные кэша второго уровня. Данные, хранящиеся в кэше второго уровня, будут доступны всему приложению. Но мы должны включить это явно.
источник
В кэше второго уровня файлы домена hbm могут иметь изменяемый ключ и значение false. Например, в этом классе предметной области некоторая продолжительность дня остается постоянной как универсальная истина. Таким образом, он может быть помечен как неизменный во всем приложении.
источник