Строгие и нестрогие стратегии параллелизма кэша NHibernate

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

  •  01-07-2019
  •  | 
  •  

Вопрос

Этот вопрос касается разницы между стратегиями параллельного кэширования ReadWrite и NonStrictReadWrite для кэша второго уровня NHibernate.

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

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

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

Решение

То, что вы считаете правильным, в среде с одной целью/потоком разницы мало.Однако, если вы посмотрите на поставщиков кэша, даже в многопоточном сценарии происходят некоторые изменения.

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

В нестрогом режиме у вас также есть возможность грязного чтения, поскольку кеш не заблокирован во время чтения, и вы не увидите результат изменения элемента другим потоком.Строго говоря, ключ кэша для этого элемента заблокируется, и вы будете задержаны, но увидите самый последний результат.

Таким образом, даже в одной целевой среде, если на объектах выполняется большое количество одновременных операций чтения/редактирования, у вас есть шанс увидеть неточные данные.

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

Другие советы

Я создал пост здесь объяснение различий.Пожалуйста, посмотрите и не стесняйтесь комментировать.

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