Повторное использование запросов в Hibernate

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

9
задан Daniel 3 April 2011 в 14:31
поделиться