Не могу понять, как кеш запросов и L2C работает в спящем режиме
Я настроил Hazelcast как L2C для Hibernate. Затем сделал 1-й запрос, используя конструктор запросов Hibernate с подсказкой кеша запросов, и я получил:
org.hibernate.engine.internal.StatisticalLoggingSessionEventListener:258 - Session Metrics {
3263961 nanoseconds spent acquiring 1 JDBC connections;
401548 nanoseconds spent releasing 1 JDBC connections;
4244272 nanoseconds spent preparing 1 JDBC statements;
6266312446 nanoseconds spent executing 1 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
60891580391 nanoseconds spent performing 641667 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
8550 nanoseconds spent performing 1 L2C misses;
0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)
}
Получил ставит в L2C. Когда я делаю второй запрос, я получил тонну запросов на выборку с поиском по идентификатору.
Конфигурации для Hazelcast, Hibernate просты, ничего сложного.
Сущность - это наследование таблицы соединений.
Аннотация @Cache(use = CacheConcurrencyStrategy.READ_WRITE), используемая в суперклассе.
Проверил статью Влада Михалча: https://vladmihalcea.com/hibernate-query-cache-n-plus-1-issue - предложения, чтобы избежать проблемы n+1, не полностью подходят для моего случая.
Ожидается получение результатов из кэша при втором запросе, но, похоже, я не понимаю, как работает кэш запросов. Может кто-нибудь объяснить шаг за шагом, как работает кеш запросов?
1 ответ
Hibernate не сохраняет результат запроса в области запроса в целом; он скорее хранит набор идентификаторов, где сущности находятся в других регионах "сущностей".
Мое предположение: если что-то неправильно настроено и Hazelcast не хранит сами сущности, возможно, что хотя список идентификаторов записей известен из кеша запросов, он загружает действительные сущности один за другим.
Сделайте запрос и проверьте размеры областей кеша.