Кэш второго уровня в спящем режиме. Когда устаревшие члены коллекции могут быть возвращены из кэша второго уровня? - PullRequest
4 голосов
/ 28 мая 2010

Мой коллега и я обсуждали, когда (если?) Коллекция, кэшированная в кэше второго уровня, может вернуть устаревшие данные (мы используем ehcache и hibernate 3.2.4).

Вот сценарий:

  • родительский объект P кэшируется и является сущностью.
  • Родитель имеет коллекцию (сумку) детей, которые кешируются и ленився.
  • Дочерние объекты C кэшируются и являются сущностями.
  • Мы используем нестрогое чтение-запись в качестве нашей стратегии параллелизма в кэше для всех из них.
  • Наша фабрика сессий имеет область действия, и задействована только 1 JVM.
  • Предположим, что области кэша для всех вышеперечисленных кэшей достаточно велики, чтобы легко хранить в памяти все экземпляры всех детей и родителей.

В момент времени T1: загрузите родительский P и дочерние элементы C1 ... CN, выполнив session.load (p) и выполнив итерацию по дочерней коллекции, чтобы загрузить все C1 ... CN.

В момент времени T2: другой сеанс загружает C1 и обновляет C1, изменяя некоторые из его данных.

При каких обстоятельствах я могу вызвать P.getChildren (). Get (0), и будет возвращена устаревшая версия C1 (версия C1, загруженная в момент времени T1)?

Я думаю, что есть два:

  1. Если я нахожусь в том же сеансе гибернации, что и операции в T1 (в этом случае возвращается кэшированная версия сеанса)
  2. При нестрогом режиме чтения с чтением было бы возможно иметь состояние гонки, при котором обновление в момент времени T2 и загрузка происходят почти одновременно, и загрузка выигрывает гонку и извлекает устаревший объект из кэша. (В этом случае я могу перейти на чтение-запись, и все будет в порядке)
...