Спящий режим кэша 2-го уровня, не кэширующий зафиксированные объекты

StackOverflow https://stackoverflow.com/questions/1401535

Вопрос

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

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

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

Это было полезно?

Решение

Современная книга POJO's in Action рассказывает об этом

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

И...

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

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

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

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

с уважением,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top