如何从二级查询缓存中获取条目?

时间:2010-05-15 21:51:19

标签: java hibernate grails second-level-cache

在我的grails应用程序中,我想显示所有区域的二级缓存的所有当前条目

我的代码如下:

def getCacheStats() {
  StatisticsImpl stats = sessionFactory.statistics
  for (regionName in stats.secondLevelCacheRegionNames) {
    log.debug stats.getSecondLevelCacheStatistics(regionName).entries
  }
}

但是,只要区域名称不是 org.hibernate.cache.StandardQueryCache(用于Query Cache的区域),一切正常。在这种情况下,抛出异常:

java.lang.ClassCastException: org.hibernate.cache.QueryKey cannot be cast to org.hibernate.cache.CacheKey

谷歌搜索后,我没有找到任何关于如何显示与区域StandardQueryCacheUpdateTimestampsCache相关联的缓存查询结果集的条目列表的线索。

你能帮我找到解决办法吗?

1 个答案:

答案 0 :(得分:3)

它相当复杂,但这可以让你更进一步。您可以通过SessionFactory访问查询缓存,因此假设您可以访问它(例如通过'def sessionFactory'),那么您可以访问这样的基础缓存:

def cache = sessionFactory.queryCache
def realCache = cache.region.@underlyingCache.backingCache
def keys = realCache.keys
for (key in keys) {
    def value = realCache.get(key).value
    // do something with the value
}

请注意,值将是Long值列表。我不确定第一个表示什么(它是一个很大的值,例如5219682970079232),但其余的是缓存的域类实例的ID。