每次执行SELECT语句时JPA都可以缓存查询吗?

时间:2014-05-17 19:17:34

标签: hibernate jpa

例如,我有以下查询(JPA的实现是Hibernate):

return em.createQuery("select m.username from Member m", String.class)
        .getResultList();

我知道JPA会在我第一次执行它时将此查询解释为SQL,但如果是第二次怎么办? JPA会再次解释它吗?这很费时间。

如果我将所有这些查询更改为NamedQuery,是否会有明显的性能提升?

1 个答案:

答案 0 :(得分:0)

是的,缓存了查询计划。

这是流程:

  1. em.createQuery(..)
  2. org.hibernate.internal.SessionImpl.createQuery(String queryString)
  3. org.hibernate.internal.AbstractSessionImpl.createQuery(String queryString)
  4. org.hibernate.internal.SessionFactoryImpl.getQueryPlanCache()。getHQLQueryPlan(query,..);
  5. 因此查询会缓存在会话工厂中,因此一旦查询被翻译,它将在所有未来的会话中共享。