Кэш запросов 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. Я неправильно понимаю это утверждение или что-то еще?