Кэш запросов Hibernate - для объектов, не находящихся в кэше 2-го уровня - рискованно? полезно? плохая практика?

Связанные с этимвопрос

Предпосылка:

Это мои предположения, основанные на моем прочтении, опыте и понимании, они могут быть неверными, если да, прокомментируйте, а яотредактирую вопрос.

Кеш запросов хорош в основном вместе с кешем 2-го уровняКеш запросов кеширует идентификаторы результатов запросов + параметрыКеш запросов опасен, если база данных была изменена, ит отражается в кеш

Вопрос:

У меня есть объект, которого нет в кэше 2-го уровня. Из-за плохого программирования или других ограничений код, который загружает объект, вызывается несколько раз в одном сеансе гибернации. Повторное использование использует запрос поиска HQL, например,

 hibernateTemplate.find("from Foo f where f.bar > ?", bar);

Перед добавлением кеша запросов, если вышеуказанный код был вызван N раз в одном сеансе Hibernate, в базе данных было N обращений

Тогда я хотел посмотреть, что произойдет, если я добавлю кеш запросов:

 Query query = session.createQuery("from Foo f where f.bar > ?");
 query.setCacheable(true);
 query.setParameter(bar);
 query.list();

Когда я добавил кеш запросов, ямы заметили, что во время той же сессии hibernate небольше не попадать в базу данных, только один раз за сеанс.

Итак, мое первое предположение заключается в том, что Hibernate сначала выполняет поиск в кэше сеанса, а затем в кэше 2-го уровня. Это предположение верно?Я также предполагаю, что если объект (Foo), который не находится в кэше 2-го уровня, был изменен в базе данных, тогда кэш запросов, будучи пересекающим сессию, вернет неправильные идентификаторы и, следовательно, неправильные объекты. Это верно?Тогда можно ли с уверенностью сказать, что использование кеша запросов для запросов, включающих неизменяемую информацию даже для объектов, не кэшированных в 2L, является хорошей практикой? (например, запрос о том, что его предложение where содержит условие, которое всегда будет возвращать одинаковые результаты, например "выберите p.ser_num, где p.id =? " когда пары ser_num и id не меняются после создания)

Кстати, в связанныхвопрос утверждается, что кеш запросов неработать с областью Session Cache. Я неправильно понимаю это утверждение или что-то еще?

Ответы на вопрос(3)

Ваш ответ на вопрос