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





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-го уровня. в большинстве случаев в нем нет необходимости, но и нет возможности избавиться от него. но вы должны думать об этом все время ..
@ses В большинстве случаев вам понадобится кеш 1-го уровня. В противном случае у вас будет проблема с очень ПЛОХОЙ ПРОИЗВОДИТЕЛЬНОСТЬЮ, такая как запрос N + 1, или отсутствие нетерпеливого кеша предварительной выборки, или запрос один раз при каждом доступе к атрибуту.
Обычно мы используем сеанс в течение очень короткого периода времени [и очень рекомендуют его] / короткоживущий сеанс: мы даже не используем этот кеш в этот период. если сеанс долгоживущий, мы отключаем данные (например, при редактировании формы) из сеанса. Кажется, это необходимо только для одного сценария, когда мы пытаемся использовать query-session-api при создании некоторого сложного запроса после запроса для долгоживущего сеанса.
@DennisCheung: Ссылка мертва. Пожалуйста, обновите javabeat.net/introduction-to-hibernate-caching
В блоге Оптимизация логики есть довольно хорошее объяснение кеширования первого уровня.
По сути, кеширование первого уровня происходит для каждого сеанса, тогда как кэширование второго уровня может быть разделено на несколько сеансов.
это простые слова прямо здесь, я не знаю, почему им так трудно это объяснить
хе-хе ... да, я действительно не знаю, как я мог быть намного проще :)
мне это на самом деле яснее. Первый - за сеанс, второй - за несколько сеансов, это просто для меня. Разве мы не можем проголосовать дважды? : D
нет примера, зачем нужен кеш 1-го уровня. как по мне в большинстве случаев он вообще не нужен. но вы должны постоянно думать об этом и о сеансе.
Прошло 11 лет с момента этого ответа, и, к сожалению, сейчас ссылка не существует. Но я нашел его содержимое на его странице архива: web.archive.org/web/20081207044228/http://…
по умолчанию NHibernate использует кеширование первого уровня, основанное на объекте сеанса. но если вы работаете в многосерверной среде, то кеш первого уровня может быть не очень масштабируемым, а также с некоторыми проблемами производительности. это происходит из-за того, что он должен очень часто обращаться к базе данных, поскольку данные распределяются по нескольким серверам. другими словами, NHibernate предоставляет базовый, не очень сложный внутрипроцессный кэш L1 из коробки. Однако он не предоставляет функций, которые должны быть у решения для кэширования, чтобы оказывать заметное влияние на производительность приложения.
Таким образом, все эти проблемы связаны с использованием кэша L2, который связан с объектами фабрики сеансов. это сокращает трудоемкие обращения к базе данных, что в конечном итоге увеличивает время отклика приложения.
В кэше второго уровня файлы hbm домена могут иметь изменяемый ключ и значение false. Например, В этом классе предметной области часть продолжительности дня остается неизменной как универсальная истина. Таким образом, его можно пометить как неизменяемый для всего приложения.
Вот базовое объяснение кеш-памяти гибернации ...
Кэш первого уровня связан с объектом «сеанс».
Объем объектов кеша относится к сеансу. После закрытия сеанса кэшированные объекты исчезают навсегда.
Кэш первого уровня включен по умолчанию, и вы не можете его отключить.
Когда мы запрашиваем объект в первый раз, он извлекается из базы данных и сохраняется в кэше первого уровня, связанном с сеансом гибернации.
Если мы снова запросим тот же объект с тем же объектом сеанса, он будет загружен из кеша, и запрос sql не будет выполнен.
Загруженный объект можно удалить из сеанса с помощью метода evict(). При следующей загрузке этого объекта снова будет выполнен вызов базы данных, если он был удален с помощью метода evict().
Весь кеш сеанса можно удалить с помощью метода clear(). Он удалит все объекты, хранящиеся в кеше.
Кэш второго уровня отличается от кеша первого уровня, который доступен для глобального использования в области фабрики сеансов.
Кэш второго уровня создается в области фабрики сеансов и доступен для использования во всех сеансах, которые создаются с использованием этой конкретной фабрики сеансов.
Это также означает, что как только фабрика сеансов закрывается, весь связанный с ней кеш умирает, и диспетчер кеша также закрывается.
Всякий раз, когда сеанс гибернации пытается загрузить объект, в первую очередь он ищет кэшированную копию объекта в кэше первого уровня (связанном с конкретным сеансом гибернации).
Если кешированная копия сущности присутствует в кэше первого уровня, она возвращается в результате метода загрузки.
Если в кэше первого уровня нет кэшированного объекта, то ищется кеш второго уровня для кэшированного объекта.
Если кэш второго уровня имеет кэшированный объект, он возвращается в результате метода загрузки. Но перед возвратом объекта он также сохраняется в кэше первого уровня, так что следующий вызов метода загрузки для объекта вернет объект из самого кеша первого уровня, и не нужно будет снова переходить в кеш второго уровня.
Если объект не найден в кэше первого уровня и также в кэше второго уровня, то выполняется запрос к базе данных, и объект сохраняется на обоих уровнях кеша перед возвратом в качестве ответа метода load().
Отличное объяснение! Если бы вы могли нарисовать какие-нибудь диаграммы последовательности, это было бы здорово !!!
подробное и приятное объяснение
Если вы хотите пересмотреть то, что вы уже знаете, то два приведенных выше ответа Денниса C и Iomaxx великолепны, очень кратки и легко запоминаются. Однако, если вы ищете объяснение разницы, хотя еще этого не знаете, этот ответ будет намного лучше!
Отличное объяснение !!
Кэш первого уровня
Объект сеанса содержит данные кэша первого уровня. По умолчанию он включен. Данные кэша первого уровня не будут доступны для всего приложения. Приложение может использовать множество объектов сеанса.
Кэш второго уровня
Объект SessionFactory содержит данные кэша второго уровня. Данные, хранящиеся в кэше второго уровня, будут доступны для всего приложения. Но нам нужно включить его явно.
Hibernate пытается отложить очистку контекста постоянства до последнего возможного момента. Эта стратегия традиционно известна как транзакционная обратная запись.
Записанная запись больше связана с очисткой Hibernate, чем с какой-либо логической или физической транзакцией. Во время транзакции сброс может происходить несколько раз.
Сброшенные изменения видны только для текущей транзакции базы данных. Пока текущая транзакция не зафиксирована, другие параллельные транзакции не видят никаких изменений.
Благодаря кеш-памяти первого уровня Hibernate может выполнять несколько оптимизаций:
Правильное решение для кеширования должно охватывать несколько сеансов Hibernate, и именно по этой причине Hibernate также поддерживает дополнительный кеш второго уровня.
Кэш второго уровня привязан к жизненному циклу SessionFactory, поэтому он уничтожается только при закрытии SessionFactory (обычно при завершении работы приложения). Кэш второго уровня в основном ориентирован на сущности, хотя он также поддерживает дополнительное решение для кэширования запросов.
При загрузке объекта Hibernate выполнит следующие действия:
+1 для сопоставления кэша первого уровня с объектом сеанса и кэша второго уровня с объектом фабрики сеансов. мне даже не нужно было продолжать читать.