Как получить записи из кэша запроса второго уровня?
-
27-09-2019 - |
Вопрос
В моем гладкий Применение, я хочу отобразить Все текущие записи кеша второго уровня из всех регионов.
Мой код следующий:
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
.
Не могли бы вы помочь мне найти решение для этого?
Решение
Это довольно сложно, но это должно вас дальше. Вы можете получить доступ к кэше кэш-памяти запросов через Sessionactory, поэтому предполагая, что у вас есть доступ к этому (например, Via 'Def Sessionacfactory'), вы можете добраться до базовых кэшей, как это:
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), но остальные являются идентификаторами кэшированных экземпляров классов доменов.