Скорее всего, у вас проблемы с репликацией кэша, возможно, из-за отсутствия / неправильной конфигурации координации кэша.
Предположение
Вы включили кэш второго уровня и кэш запросов в Hibernate, который хорошо, конечно, и вы получили повышение производительности. Проблема заключается в том, что вы используете 2 узла, каждый из которых имеет свой собственный кэш, или они неправильно делают недействительными кэши.
Например, узел A выполняет запрос для всех объектов Z (т. Е. Список категорий продуктов: Z1 , Z2, ...) и кеширует результат. Позже, узел B добавляет новую сущность категории продуктов Zn. Узел A не будет использовать этот новый объект, пока его собственный кэш не станет недействительным; до тех пор он будет использовать кэшированный результирующий набор, который не включает Zn.
. Вы можете проверить это предположение, если проблема исчезнет, когда вы отключите кэширование запросов (т. е. установите <property name="hibernate.cache.use_query_cache">false</property>
).
Решения
Вариант A
Оптимизация аннулирования кэша. Это в значительной степени зависит от потребностей вашего бизнеса, но некоторые предложения будут следующими:
- Уменьшайте TTL кэша для определенных запросов, пока не найдете подходящее место (промежуток времени, в течение которого вы можете допустить пропущенные / дополнительные значения). Для этого вы можете использовать регионы EhCache.
- Отключить кэширование для всех объектов в целом
Пример:
Создать регион для короткого (то есть 5-минутного) запроса приводит к ehcache.xml
:
<cache name = "short-lived"
maxElementsInMemory = "500"
eternal = "false"
timeToIdleSeconds = "600"
timeToLiveSeconds = "600"
overflowToDisk = "false"
/>
Для определенных c запросов, которые необходимо часто обновлять:
Query query = session.createQuery("FROM Z");
query.setCacheable(true);
query.setCacheRegion("short-lived");
Подробнее о topi c здесь .
Вариант B
Это решение real . Вы можете иметь кэш shared для всех узлов. Хотя это, безусловно, сложнее в настройке и настройке, это дает вам максимальную производительность Например, кэшированные запросы будут выполняться один раз для каждого кластера, а не один раз для каждого узла, как сейчас.
Взгляните на Terracotta .