Я использую Hibernate кэш второго уровня и кеш запросов, а также hazelcast в качестве провайдера кэша второго уровня. Hazelcast настроен как кластер p2p. У меня есть случай, когда таблица БД внешне обновляется. Мне нужно как-то обновить или удалить кеш запросов для этой сущности, так как он продолжает возвращать старые данные. Я пишу конечную точку API, которая должна вызывать сброс кэша.
Один вариант, который я уже пробовал, - исключение региона запроса:
final SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
sessionFactory.getCache().evictQueryRegion("myQueryRegion");
Поскольку кэш запросов является локальным для каждого узла - он не освобождает кэш запросов для других узлов.
Еще один вариант, который я попробовал, - это исключить область Entity, но если кэш Entity будет удален раньше, чем кэш Query, он завершится с N + 1 выбором в следующий раз, когда я вызову свой метод репозитория. Нашел информацию об этом здесь .
final SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
sessionFactory.getCache().evictEntityRegion("myEntityRegion");
Насколько я знаю, обновление таблицы любым способом вызывает вытеснение кеша запросов и распространяется на другие узлы. Поэтому я использовал следующий обходной путь:
final MyEntity saved = repository.save(new MyEntity());
repository.delete(saved.getId());
Хотя кажется, что это работает до сих пор, похоже, это не правильный \ спасительный путь. Также у меня есть некоторые опасения относительно того, как обращаться с кешами Collection, если у Entity есть такие.
Есть ли другой, проверенный способ добиться такого поведения?