Каковы кэши первого и второго уровня в Hibernate? - PullRequest
229 голосов
/ 03 декабря 2008

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

Ответы [ 7 ]

286 голосов
/ 03 декабря 2008

1.1) Кэш первого уровня

Кэш первого уровня всегда Связывается с объектом Session . Hibernate использует этот кеш по умолчанию. Здесь он обрабатывает один транзакция за другой, означает, что не будет обрабатывать одну транзакцию много раз. В основном это уменьшает количество SQL-запросов, необходимых для генерировать в рамках данной транзакции. То есть вместо обновления после каждая модификация, сделанная в транзакции, обновляет транзакцию только в конце транзакции.

1.2) Кэш второго уровня

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

Цитируется из: http://javabeat.net/introduction-to-hibernate-caching/

114 голосов
/ 04 декабря 2008

Существует довольно хорошее объяснение кэширования первого уровня в блоге Streamline Logic .

По сути, кэширование первого уровня происходит отдельно для каждого сеанса, тогда как кэширование второго уровня может совместно использоваться несколькими сеансами.

97 голосов
/ 01 августа 2014

Вот несколько основных объяснений кибернетического кэша ...

Кэш первого уровня связан с объектом «сеанс». Область действия объектов кэша имеет сессию. Как только сессия закрыта, кэшированные объекты исчезают навсегда. Кэш первого уровня включен по умолчанию, и вы не можете его отключить. Когда мы запрашиваем объект в первый раз, он извлекается из базы данных и сохраняется в кэше первого уровня, связанном с сеансом гибернации. Если мы снова запросим тот же объект с тем же объектом сеанса, он будет загружен из кэша, и никакой SQL-запрос не будет выполнен. Загруженный объект можно удалить из сеанса, используя метод evict(). Следующая загрузка этой сущности снова вызовет базу данных, если она была удалена с использованием метода evict(). Весь кэш сеанса может быть удален методом clear(). Это удалит все сущности, хранящиеся в кеше.

Кэш второго уровня отличается от кэша первого уровня, который доступен для глобального использования в области фабрики сеансов. Кэш второго уровня создается в области фабрики сеансов и доступен для использования во всех сеансах, созданных с использованием этой конкретной фабрики сеансов. Это также означает, что после закрытия фабрики сеансов весь кэш, связанный с ним, умирает, и менеджер кэша также закрывается. Всякий раз, когда сеанс hibernate пытается загрузить объект, самое первое место, где он ищет кэшированную копию объекта в кэше первого уровня (связан с конкретным сеансом hibernate). Если кэшированная копия сущности присутствует в кеше первого уровня, она возвращается как результат метода загрузки. Если в кэше первого уровня нет кэшированной сущности, то для кэшированной сущности ищется кэш второго уровня. Если кэш второго уровня имеет кэшированную сущность, он возвращается как результат метода load. Но перед возвратом объекта он также сохраняется в кэше первого уровня, так что при следующем вызове метода загрузки для объекта объект будет возвращен из самого кэша первого уровня, и больше не потребуется возвращаться в кэш второго уровня. Если объект не найден в кэше первого уровня и кэше второго уровня, то выполняется запрос к базе данных, и объект сохраняется на обоих уровнях кэша, а затем возвращается как ответ метода load().

9 голосов
/ 12 июля 2018

Кэш первого уровня

Hibernate пытается отложить сброс постоянства контекста до последнего возможного момента. Как я объяснил в этой статье , эта стратегия традиционно известна как транзакционная обратная запись.

Перезапись в большей степени связана с сбросом Hibernate, а не с какой-либо логической или физической транзакцией. Во время транзакции сброс может происходить несколько раз.

enter image description here

Сброшенные изменения видны только для текущей транзакции базы данных. Пока текущая транзакция не будет зафиксирована, другие параллельные транзакции не видят изменений.

Благодаря кешу первого уровня, Hibernate может выполнять несколько оптимизаций:

Кэш второго уровня

Правильное решение для кэширования должно охватывать несколько сеансов Hibernate, и поэтому Hibernate также поддерживает дополнительный кэш второго уровня.

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

Для более подробной информации, посмотрите эту статью .

3 голосов
/ 27 апреля 2011

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

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

1 голос
/ 31 октября 2017

Кэш первого уровня

Объект Session содержит данные кэша первого уровня. Это включено по умолчанию. Данные кэша первого уровня не будут доступны всему приложению. Приложение может использовать много объектов сеанса.

Кэш второго уровня

Объект SessionFactory содержит данные кэша второго уровня. Данные, хранящиеся в кэше второго уровня, будут доступны всему приложению. Но нам нужно включить его явно.

0 голосов
/ 16 мая 2014

В кэше второго уровня файлы домена hbm могут иметь изменяемый ключ и значение false. Например, В этом доменном классе некоторая продолжительность дня остается постоянной как универсальная истина. Таким образом, он может быть помечен как неизменный во всем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...