【问题标题】:Will Cache Query work on itself? JPA Cache Eclipselink缓存查询会自行工作吗? JPA 缓存 Eclipselink
【发布时间】:2016-01-27 08:59:28
【问题描述】:

我有一个关于 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 中)。

标签: jpa caching eclipselink


【解决方案1】:

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

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

如果您执行不同的查询,它将需要或使用自己的查询缓存,独立于 DBConstants.ALL_SERVICES 的一个设置。默认情况下没有一个,因此它每次都会进入数据库,返回适当的行,然后为已经构建的实体访问 1 级缓存 (EntityManager) 和/或 2 级缓存。如果没有,它将构建它们并将它们放入适当的实体缓存中。

我发现 this 是一个很好的资源来描述 JPA 中的缓存

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-18
    • 2011-03-29
    • 2014-01-22
    • 2012-11-17
    • 1970-01-01
    • 2016-03-18
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多