Строгие и нестрогие стратегии параллелизма кэша NHibernate
-
01-07-2019 - |
Вопрос
Этот вопрос касается разницы между стратегиями параллельного кэширования ReadWrite и NonStrictReadWrite для кэша второго уровня NHibernate.
Насколько я понимаю, разница между этими двумя стратегиями актуальна, когда у вас распределенная воспроизведенный кэш - нестрогое не гарантирует, что один кеш имеет то же самое значение, что и другой кеш, тогда как строгое чтение/запись должно - при условии, что поставщик кэша выполняет соответствующую распределенную блокировку.
Часть, которую я не понимаю, заключается в том, какое значение имеет различие между строгим и нестрогим, когда у вас есть один кеш или распределенный кэш. разделенный (нереплицируемый) кэш.Может ли это быть актуально?Мне кажется, что в нереплицируемых сценариях кеш временных меток гарантирует, что устаревшие результаты не будут предоставлены.Если это может иметь значение, я хотел бы увидеть пример.
Решение
То, что вы считаете правильным, в среде с одной целью/потоком разницы мало.Однако, если вы посмотрите на поставщиков кэша, даже в многопоточном сценарии происходят некоторые изменения.
Способ повторного кэширования объекта из измененного состояния отличается в нестрогих случаях.Например, если ваш объект требует перезагрузки гораздо сложнее, но вы хотите, чтобы это происходило после обновления, а не выставлять счет следующему пользователю, тогда вы увидите разную производительность при строгом и нестрогом режиме.Например:нестрогий просто выгружает объект из кэша после выполнения обновления... цена платится за выборку при следующем доступе вместо обработчика событий после обновления.В строгой модели повторное кэширование выполняется автоматически.То же самое происходит и со вставками: нестрогое ничего не сделает, а строгое отстает и загружает вновь вставленный объект в кеш.
В нестрогом режиме у вас также есть возможность грязного чтения, поскольку кеш не заблокирован во время чтения, и вы не увидите результат изменения элемента другим потоком.Строго говоря, ключ кэша для этого элемента заблокируется, и вы будете задержаны, но увидите самый последний результат.
Таким образом, даже в одной целевой среде, если на объектах выполняется большое количество одновременных операций чтения/редактирования, у вас есть шанс увидеть неточные данные.
Это, конечно, становится проблемой, когда выполняется сохранение и загружается экран редактирования:человек, думающий, что он редактирует последнюю версию объекта, на самом деле таковым не является, и его ждет неприятный сюрприз, когда он попытается сохранить изменения в загруженных устаревших данных.
Другие советы
Я создал пост здесь объяснение различий.Пожалуйста, посмотрите и не стесняйтесь комментировать.