当前位置: 首页 > 面试题库 >

JPA:缓存查询

屠锦
2023-03-14
问题内容

我正在使用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查询缓存这样的缓存查询结果的东西。在这里,我想更快地执行查询。


问题答案:

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



 类似资料:
  • 问题内容: JPA()中的本机查询是否支持缓存? 我正在填写自己的数据传输对象,因为sql查询会联接多个表,并且仅从表中获取几个列。 问候 问题答案: 这是可能的,但 您必须使用显式或。 也可以看看 缓存SQL查询问题 hibernate:真正了解二级和查询缓存

  • 我使用Spring Boot 1.4.1和spring-boot-starter-data-jpa 当查询我的自定义方法时,比如'find byname(String name)',它不是缓存。

  • 我正在使用WildFly 8.1,所以JPA 2.1和Hibernate 4.3.5 我想在WildFly中使用JPA共享缓存/二级缓存 我遵循WildFly文档:https://docs.jboss.org/author/display/WFLY8/JPA参考指南#使用InfinispanSecondlevelCache的JPA参考指南 这是我的persitience.xml: 我将属性设置为h

  • 问题内容: 一级缓存与hibernate中的查询缓存是否不同?我看过有关第一级和查询缓存的文章,所以我很困惑。 问题答案: 默认情况下,第一级缓存处于启用状态,并且基于每个会话。默认情况下,查询缓存未启用,它在多个会话之间共享,应始终与二级缓存一起使用。 要启用查询缓存,应使用以下属性:

  • 问题内容: 我找到了一些说明,说明如何配置纯hibernate模式以使用EHCache。但是我找不到任何有关如何配置JPA2.0 EntityManager以使用缓存的说明。Hibernate 3.5.2是我的JPA2.0提供程序。 编辑// 对实体足够了吗?还是应该使用配置实体? 问题答案: 我找到了一些说明,说明如何配置纯hibernate模式以使用EHCache。但是我找不到任何有关如何配置

  • 问题内容: 我想使用JPA(eclipselink)从数据库中获取数据。该数据库由许多其他来源更改,因此我想针对我执行的每个查找返回数据库。我已经阅读了许多有关禁用缓存的文章,但这似乎不起作用。有任何想法吗? 我正在尝试执行以下代码: 一==二是正确的,而我希望它是错误的。 我尝试将以下每个/所有内容添加到我的persistence.xml中 我也尝试过将@Cache注释添加到实体本身: 我误会了