缓存查询会自行运行吗? JPA 缓存 Eclipselink

Will Cache Query work on itself? JPA Cache Eclipselink

我有一个关于 JPA 缓存的简单问题。 我为名为 "Service" 的持久性单元创建了一个命名查询,如下所示:

@NamedQuery(name = DBConstants.ALL_SERVICES, query = "select s from Service s",
            hints = {
                    @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE),
                    @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE_SIZE, value = "200")
            }),

以上代码让 JPA 缓存最多存储 200 个结果条目。 现在,当我执行像 "Select s from Service s where s.name='abc'" 这样的子查询时,会发生什么?

它 运行 是对缓存条目进行查询还是将其传递给数据库以处理查询?感谢您的支持。

我认为您混淆了不同级别的缓存,您使用的 200 值不是实体数,而是存储的查询执行数。有关详细信息,请参阅 q_query-results-cache_size.htm,因为您使用的 200 值应设置为 1 - 您不会使用不同的参数执行此查询,因此只需要缓存一个结果

您的查询提示为该特定查询设置查询缓存:查询缓存意味着缓存该特定查询的结果。在这种情况下,如果您第一次执行 DBConstants.ALL_SERVICES 查询,它将从数据库中获取所有服务结果。在下一次执行 DBConstants.ALL_SERVICES 时,它将检查查询缓存并查看是否已执行,与 return 完全相同的结果。这些实体结果也会放在实体缓存中:一级和二级(EM和EMF)缓存。

如果您执行不同的查询,它将需要或使用自己的查询缓存,独立于 DBConstants.ALL_SERVICES 的设置。默认情况下没有,所以它每次都会去数据库,return 适当的行,然后命中一级缓存 (EntityManager) and/or 实体的二级缓存,如果它们是已经建成。如果没有,它将构建它们并将它们放入适当的实体缓存中。

我发现 this 描述 JPA 缓存的好资源