Я использую 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.Обязательно используйте параметризованные запросы ВСЕГДА, поэтому сохраняйте кэш планов маленьким.