Что такое кеши первого и второго уровня в (N) Hibernate?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
252
0
186 469
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

First-level cache always Associates with the Session object. Hibernate uses this cache by default. Here, it processes one transaction after another one, means wont process one transaction many times. Mainly it reduces the number of SQL queries it needs to generate within a given transaction. That is instead of updating after every modification done in the transaction, it updates the transaction only at the end of the transaction.

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

Second-level cache always associates with the Session Factory object. While running the transactions, in between it loads the objects at the Session Factory level, so that those objects will be available to the entire application, not bound to single user. Since the objects are already loaded in the cache, whenever an object is returned by the query, at that time no need to go for a database transaction. In this way the second level cache works. Here we can use query level cache also.

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

+1 для сопоставления кэша первого уровня с объектом сеанса и кэша второго уровня с объектом фабрики сеансов. мне даже не нужно было продолжать читать.

Mahes 02.11.2011 23:55

Кэш 1-го уровня. в большинстве случаев в нем нет необходимости, но и нет возможности избавиться от него. но вы должны думать об этом все время ..

ses 28.03.2013 21:39

@ses В большинстве случаев вам понадобится кеш 1-го уровня. В противном случае у вас будет проблема с очень ПЛОХОЙ ПРОИЗВОДИТЕЛЬНОСТЬЮ, такая как запрос N + 1, или отсутствие нетерпеливого кеша предварительной выборки, или запрос один раз при каждом доступе к атрибуту.

Dennis C 03.04.2013 06:41

Обычно мы используем сеанс в течение очень короткого периода времени [и очень рекомендуют его] / короткоживущий сеанс: мы даже не используем этот кеш в этот период. если сеанс долгоживущий, мы отключаем данные (например, при редактировании формы) из сеанса. Кажется, это необходимо только для одного сценария, когда мы пытаемся использовать query-session-api при создании некоторого сложного запроса после запроса для долгоживущего сеанса.

ses 03.04.2013 17:44

@DennisCheung: Ссылка мертва. Пожалуйста, обновите javabeat.net/introduction-to-hibernate-caching

NewUser 31.08.2016 06:07

В блоге Оптимизация логики есть довольно хорошее объяснение кеширования первого уровня.

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

это простые слова прямо здесь, я не знаю, почему им так трудно это объяснить

BlackTigerX 30.07.2011 01:11

хе-хе ... да, я действительно не знаю, как я мог быть намного проще :)

lomaxx 30.07.2011 07:13

мне это на самом деле яснее. Первый - за сеанс, второй - за несколько сеансов, это просто для меня. Разве мы не можем проголосовать дважды? : D

black sensei 02.06.2012 14:45

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

ses 28.03.2013 21:44

Прошло 11 лет с момента этого ответа, и, к сожалению, сейчас ссылка не существует. Но я нашел его содержимое на его странице архива: web.archive.org/web/20081207044228/http://…

Golu 15.03.2019 21:26

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

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

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

Вот базовое объяснение кеш-памяти гибернации ...

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

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

Отличное объяснение! Если бы вы могли нарисовать какие-нибудь диаграммы последовательности, это было бы здорово !!!

Adelin 16.02.2017 16:47

подробное и приятное объяснение

ManishS 08.05.2018 08:17

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

The Student Soul 01.06.2018 10:31

Отличное объяснение !!

blu3 04.12.2018 22:07

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

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

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

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

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

Hibernate пытается отложить очистку контекста постоянства до последнего возможного момента. Эта стратегия традиционно известна как транзакционная обратная запись.

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

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

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

  • Пакетирование операторов JDBC
  • предотвратить потерю аномалий обновления

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

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

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

При загрузке объекта Hibernate выполнит следующие действия:

Entity load flow

  1. Если сущность хранится в кэше первого уровня, то возвращается ссылка на кэшированный объект. Это обеспечивает повторяемость чтения на уровне приложения.
  2. Если объект не хранится в кэше первого уровня и кэш второго уровня активирован, то Hibernate проверяет, был ли объект кэширован в кеше второго уровня, и, если это так, возвращает его вызывающей стороне.
  3. В противном случае, если объект не хранится в кэше первого или второго уровня, он будет загружен из БД.

Другие вопросы по теме