Кэш второго уровня гибернации с возвратом устаревших данных (иногда)

Возникли проблемы с получением последовательного возврата из запроса и кеша второго уровня с Hibernate 3.3, ehCache 2.4.7, C3P0 0.9.1.2, MySQL (подтвержденный кеш запросов отключен).

Вставка нового объекта и последующая выборка этого объекта иногда (примерно в 1 из 4) не могут вернуть вставленный объект. Я могу подтвердить, что вставка работает с помощью прямого запроса к базе данных.

Вставленные объекты помечаются как таковые: @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

Это запрос findById по первичному ключу (который является строкой, именем пользователя, поскольку это процесс создания нового пользователя), который терпит неудачу.

Когда он завершается успешно и все последующие вызовы, попадания в кеш очищаются, и запросы не запускаются, как ожидалось.

Есть две подозрительные проблемы:

  • stats.getSecondLevelCacheStatistics для типа объекта показывает объект в кэше, но записывается промах кэша.
  • Показано, что запрос запускается после промаха кеша, но он возвращает устаревшие данные (в этом конкретном случае пустой список, поскольку вставка не возвращается)

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


person Geoffrey Clapp    schedule 28.12.2011    source источник


Ответы (1)


Надеюсь, это не из-за FlushMode в установленном вами сеансе. Как вы знаете, если используется FlushMode.COMMIT или FlushMode.MANUAL (и ручная очистка не вызывается), есть шанс получить устаревший объект.

person Pokuri    schedule 28.12.2011
comment
Я должен был упомянуть об этом - я проверил, все еще установлено значение по умолчанию (FlushMode.AUTO) - person Geoffrey Clapp; 28.12.2011