Я использую HQL-запросы в Hibernate, и просто подумал, могу ли я увеличить скорость повторного использования запросов в моем приложении.
Обычно вам нужно создавать новый объект Query для каждого сеанса:
Session session;
Query q1 = session.createQuery("select a from Article a where id=:id");
q1.setInteger("id",123);
List result = q1.list();
Теперь я иметь относительно сложные запросы в HQL, которые я не хочу анализировать снова и снова. Есть ли способ создать запрос и повторно использовать его в другом сеансе? Примерно так:
Session session;
Query q2 = q1.reattach();
q2.setInteger("id",123);
List result = q2.list();
Если Hibernate все равно использует подготовленные операторы, это должно привести к заметному увеличению производительности, особенно в сочетании с ConnectionPool, который кэширует подготовленные операторы.
EDIT : Повторное использование запросов в Hibernate обычно не требуется, потому что в любом случае план запроса уже кэширован в классе QueryPlanCache. Именованные запросы также не дают никаких улучшений, потому что они используются только для поиска строки запроса и с ними не связан план.
В заключение: повторное использование запросов в Hibernate бесполезно. Просто убедитесь, что ВСЕГДА используете параметризованные запросы, поэтому кеши планов должны быть небольшими.