Hibernate кэш 2-го уровня не кэширует зафиксированные объекты - PullRequest
1 голос
/ 09 сентября 2009

Мне интересно, возможно ли для кэша второго уровня Hibernate (мы используем EHCache) разрешить приложению кэшировать сущность, которая была добавлена ​​в БД, если она знает, что никакие другие приложения не изменяют БД.

Мне кажется, что если я обновлю запись A, то я знаю значение записи A и смогу ее кешировать. Системы кластеризации JVM, такие как Terracotta, поддерживают этот тип поведения с точки зрения динамической памяти JVM с использованием блокировок синхронизации Java.

Настройка режима блокировки EHCache в Hibernate

1 Ответ

2 голосов
/ 12 сентября 2009

Современная книга POJO в действии рассказывает об этом

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

* * 1006 И ...

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

И выберите одну из следующих стратегий в соответствии с JPA с книгой Hibernate

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

Добавлено к оригинальному ответу: Hibernate НЕ ГАРАНТИРУЕТ согласованность между кешем и базой данных, используете ли вы @Cache (use = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE). Если вы хотите его использовать, вы ДОЛЖНЫ настроить достаточно короткий срок действия, который может повлиять на производительность.

С уважением,

...