Кластерный hibernate-кеш с ehcache: нестрогая и строгая запись с чтением - PullRequest
11 голосов
/ 22 февраля 2011

Какая реальная разница между nonstrict-read-write и read-write? Я могу читать документы ehcache и Hibernate, но, насколько я вижу, они говорят только, что «чтение и запись лучше, если вы делаете обновления». Я нахожу это неудовлетворительным.

У меня может быть проблема с долгоживущей кэшированной коллекцией, настроенной так:

<cache name="trx.domain.Parent.children" maxElementsInMemory="5000"
    eternal="false" overflowToDisk="false" timeToIdleSeconds="1200"
    timeToLiveSeconds="1800">
    <cacheEventListenerFactory
        class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
        properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true" />

<set name="children" lazy="false" inverse="true">
    <cache usage="nonstrict-read-write"/>
    <key column="callout_id" />
    <one-to-many class="Child" />
</set>

Что именно происходит при обновлении коллекции, на узле, где происходит обновление, и других? В чем разница между nonstrict-read-write и read-write здесь? Возможно ли, что узел будет использовать свою устаревшую 10-минутную версию из кэша?

Обратите внимание на длительные тайм-ауты и асинхронную репликацию.

Ответы [ 2 ]

16 голосов
/ 17 мая 2011

Чтение-запись: если две транзакции пытаются изменить данные, то эти транзакции изолируются на уровне «чтение зафиксировано» (или повторяемое чтение, если база данных настроена на это) - обычно этого достаточно, обычно нам не нужно «Сериализуемый» уровень изоляции.

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

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

Для более подробной информации и очень хорошего объяснения смотрите здесь: Стратегия кэширования Hibernate

0 голосов
/ 21 ноября 2017

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

READ_WRITE: Эта стратегия гарантирует надежную согласованность, которой она достигает, используя «мягкие» блокировки: при обновлении кэшированной сущностидля этой сущности также сохраняется мягкая блокировка, которая освобождается после фиксации транзакции.Все одновременные транзакции, которые обращаются к программно-заблокированным записям, будут получать соответствующие данные непосредственно из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...