1

当前使用 eclipselink JPA 提供程序来访问后端实体。我正在使用命名查询来访问数据并使用以下查询缓存选项。

@NamedQueries({
@NamedQuery(name = Supplier.FIND_ALL, query = "select o from Supplier o",hints={
      @QueryHint(name=QueryHints.READ_ONLY, value=HintValues.TRUE),          
      @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE),
      @QueryHint(name = QueryHints.CACHE_STATMENT, value = HintValues.TRUE),
      @QueryHint(name = QueryHints.CACHE_STORE_MODE, value = "REFRESH"),
      @QueryHint(name = QueryHints.CACHE_RETRIEVE_MODE,value=CacheUsage.CheckCacheThenDatabase),
      }),
})

我也在实体上使用以下缓存选项。

@Cache(refreshOnlyIfNewer=true,
coordinationType=CacheCoordinationType.SEND_OBJECT_CHANGES,alwaysRefresh=true)

该查询似乎是第一次花费一些时间,但对于进一步检索( b'cozs of QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE)来说非常快。但似乎随后对数据库的任何更改都没有反映在输出中。似乎缓存没有被刷新,并且对数据库的更新更改没有反映在输出中。

需要相同的帮助。

谢谢,克里希纳

4

1 回答 1

2

你的设置没有多大意义。

QueryHints.QUERY_RESULTS_CACHE 是启用查询缓存的正确方法。但你不应该设置其他,

QueryHints.CACHE_STATMENT - 这是 JDBC 语句缓存,在查询中设置它很奇怪,通常这是为 DatabaseSource 中的所有语句配置的,如果使用 EclipseLink 连接池,则为持久单元配置。

QueryHints.CACHE_STORE_MODE - 我不确定这是否有意义,您无法刷新和缓存查询。

QueryHints.CACHE_RETRIEVE_MODE,value=CacheUsage.CheckCacheThenDatabase,这没有意义,CacheUsage 不适用于这个属性,CheckCacheThenDatabase 对使用查询缓存的查询没有意义。

EclipseLink 有两种类型的缓存,“对象缓存”(按 Id)和“查询缓存”(按查询名称和参数)。启用查询缓存后,查询结果将被缓存直到过期。默认情况下没有过期,但你可以配置它,或者手动清除查询缓存。查询缓存不会随数据库更改而更新。

见, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Query_Cache

于 2012-12-17T14:58:35.797 回答