目前使用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)
查询似乎第一次需要一段时间,但是进一步检索的速度非常快(QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE
的b'cozs)。但似乎随后对数据库的任何更改都没有反映在输出中。似乎缓存没有刷新,数据库的更新更改不会反映在输出中。
需要帮助。
谢谢, 克里希纳
答案 0 :(得分: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