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

时间:2016-01-27 08:59:29

标签: jpa caching eclipselink

我在JPA Cache上有一个简单的问题。 我为名为" 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'"这样的子查询时,会发生什么?

它会在缓存的条目上运行此查询还是将它传递给数据库来处理查询?感谢您的支持。

1 个答案:

答案 0 :(得分:2)

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

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

如果执行不同的查询,它将需要或使用自己的查询缓存,而不依赖于DBConstants.ALL_SERVICES的一个设置。默认情况下没有一个,所以它每次都会进入数据库,返回相应的行,然后点击实体的第一级缓存(EntityManager)和/或二级缓存(如果它们已经构建)。如果没有,它将构建它们并将它们放在适当的实体缓存中。

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