Повторное использование запросов в Hibernate - PullRequest
9 голосов
/ 03 апреля 2011

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

Ответы [ 2 ]

6 голосов
/ 03 апреля 2011

Вы можете использовать «Именованный запрос»: аннотируйте свой класс сущностей как

@Entity
@NamedQuery(name="Article.findById", query="select a from Article a where id=:id")     
public class Article{ ...

и затем он будет проанализирован один раз при запуске, когда вы захотите его использовать, просто позвоните:

session.getNamedQuery("Article.findById")
        .setInteger("id",123); 
1 голос
/ 03 апреля 2011

Named Query as , описанный Kiavash , выполняет то, что вы просите, но я сомневаюсь, что это даст вам какой-либо значительный прирост производительности.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...