Hibernate Кэш второго уровня, возвращающий устаревшие данные (иногда) - PullRequest
1 голос
/ 28 декабря 2011

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

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

Вставленные сущности аннотируются следующим образом: @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

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

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

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

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

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

1 Ответ

0 голосов
/ 28 декабря 2011

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

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