我在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'"
这样的子查询时,会发生什么?
它会在缓存的条目上运行此查询还是将它传递给数据库来处理查询?感谢您的支持。
答案 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中缓存的好资源