在我的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
谷歌搜索后,我没有找到任何关于如何显示与区域StandardQueryCache
和UpdateTimestampsCache
相关联的缓存查询结果集的条目列表的线索。
你能帮我找到解决办法吗?
答案 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。