Строгий и параллельный стратегии кеширования NHibernate - PullRequest
13 голосов
/ 21 сентября 2008

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

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

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

Ответы [ 2 ]

18 голосов
/ 21 сентября 2008

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

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

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

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

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

2 голосов
/ 23 июля 2012

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

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