2009-09-09 2 views
1

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

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

EHCache lock mode configuration in Hibernate

+1

Можете ли вы прояснить, что вы пытаетесь сделать? Вы спрашиваете, как вручную кэшировать объекты после слияния таким образом, чтобы Hibernate использовал их во время последующих вызовов get()? Может помочь либо образец кода, либо более подробное описание проблемы. – ChssPly76

ответ

2

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

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

И ...

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

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

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

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

приветствие,

+0

Использование @Cache (использование = CacheConcurrencyStrategy.READ_WRITE) вместо @Cache (использование = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) позволило EHCache не отменять действие после того, как объект был обновлен. Я не уверен, какие штрафы за производительность связаны с использованием READ_WRITE или NONSTRICT_READ_WRITE. Также нам предстоит далеко продвинуться в проекте, чтобы полностью включить оптимистичную блокировку с использованием столбца версии и временных меток, но это также кажется хорошим решением. – Dougnukem

+0

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

Смежные вопросы