Как получить записи из кэша запросов второго уровня? - PullRequest
4 голосов
/ 16 мая 2010

В моем приложении grails я хочу отобразить все текущие записи кэша второго уровня из всех регионов .

Мой код выглядит следующим образом:

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

Однако все работает нормально, если имя региона не равно org.hibernate.cache.StandardQueryCache (регион, используемый для Кэш запросов ). В этом случае выдается исключение:

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

Погуглив, я не нашел никаких подсказок о , как отобразить список записей наборов результатов кэшированных запросов , связанных с регионами StandardQueryCache и UpdateTimestampsCache.

Не могли бы вы помочь мне найти решение для этого?

1 Ответ

3 голосов
/ 20 мая 2010

Это довольно сложно, но это должно продвинуть вас дальше. Вы можете получить доступ к кешу запросов через 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
}

Обратите внимание, что значения будут списком длинных значений. Я не уверен, что означает первый (это большое значение, например, 5219682970079232), но остальные являются идентификаторами экземпляров кэшированного домена.

...