一尘不染

JPA:缓存查询

hibernate

我正在使用JPA在基于Java
EE的Web应用程序中加载和保留实体。Hibernate用作JPA的实现,但是我不使用特定于Hibernate的功能,而只能使用纯JPA。

这是一些DAO类的notice getOrders方法:

类OrderDao {
  EntityManager em;

  列出getOrders(Long customerId){
    查询q = em.createQuery(
      “ _从订单中选择o在哪里o.customerId =:customerId_ ”);
    q.setParameter(“ _customerId_ ”,customerId);
    **返回** q.getResultList();
  }
}

方法很简单,但是有很大的缺点。每次调用该方法时,都会在JPA实现中的某处执行以下操作:

  1. JPQL表达式被解析并编译为SQL。
  2. Statement或PreparedStatement实例均已创建并初始化。
  3. 语句实例充满参数并执行。

我认为上述步骤1和步骤2应该在每个应用程序生命周期内执行一次。但是如何做到呢?换句话说,我需要缓存查询实例。

当然,我可以在我这边实现这样的缓存。但是,等等,我正在使用现代功能强大的ORM!他们不是已经为我做了这个吗?

注意,我没有提到像Hibernate查询缓存这样的缓存查询结果的东西。在这里,我想更快地执行查询。


阅读 345

收藏
2020-06-20

共1个答案

一尘不染

是Hibernate中的查询计划缓存。因此,不会在每次调用DAO时都对HQL进行解析(因此,在您的应用程序生命周期中,#1实际上仅发生一次)。它是QueryPlanCache。它没有大量记录,因为它“有效”。但是您可以在此处找到更多信息。

2020-06-20