Обновление кеша запросов Hibernate (провайдер Hazelcast) на нескольких узлах - PullRequest
0 голосов
/ 04 июля 2019

Я использую 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 есть такие.

Есть ли другой, проверенный способ добиться такого поведения?

...