Я создаю сервис, который имеет доступ только для чтения к базе данных. У меня есть кэш запроса, и второй кэш уровня включил (режим READ_ONLY) в В спящем режиме для ускорения сервиса, как таблицы, получаемые доступ изменение редко.
Мой вопрос, если кто-то входит в DB и изменяет таблицы вручную (т.е. за пределами В спящем режиме), кэш распознает автоматически, что должен быть очищен? В кэше существует ли ограничение по времени?
Нет, кэш не собирается сканировать базу данных для вас, чтобы волшебным образом обновить себя, когда основные данные изменяются. Изменения, которые не проходят через кэш L2, не появляются в нем. Сколько времени займет тайм-аут и т.д., зависит от вашего провайдера и настроек по умолчанию. Похоже, что по умолчанию ehcache.xml настроен на 2 минуты.
Если вы не воспользуетесь API Hibernate для внесения изменений, кеш второго уровня не получит уведомления и изменения не будут видимый. Обычный способ справиться с этой ситуацией - программно исключить соответствующие объекты из кэша второго уровня для принудительного обновления. SessionFactory
предоставляет методы, позволяющие это сделать. Из раздела 19.3.Управление кешами документации:
Для кеша второго уровня существуют методы, определенные на
SessionFactory
для удаления кэшированного состояния { Экземпляр {1}}, весь класс, коллекция экземпляр или роль всей коллекции.sessionFactory.evict (Cat.class, catId); // выселить конкретный Cat sessionFactory.evict (Cat.class); // выселить всех кошек sessionFactory.evictCollection ("Cat.kittens", catId); // выселить определенную // коллекцию котят sessionFactory.evictCollection ("Cat.kittens"); // выселить все коллекции котят