Como obter entradas do cache de consulta de segundo nível?
-
27-09-2019 - |
Pergunta
No meu Grails Aplicação, eu quero exibir Todas as entradas atuais do cache de segundo nível de todas as regiões.
Meu código é o seguinte:
def getCacheStats() {
StatisticsImpl stats = sessionFactory.statistics
for (regionName in stats.secondLevelCacheRegionNames) {
log.debug stats.getSecondLevelCacheStatistics(regionName).entries
}
}
No entanto, tudo funciona bem enquanto o nome da região não é org.hibernate.cache.StandardQueryCache
(região usada para Cache de consulta). Nesse caso, uma exceção é lançada:
java.lang.ClassCastException: org.hibernate.cache.QueryKey cannot be cast to org.hibernate.cache.CacheKey
Tendo pesquisando no Google, não encontrei nenhuma pista sobre Como exibir a lista de entradas dos conjuntos de resultados de consulta em cache associado a regiões StandardQueryCache
e UpdateTimestampsCache
.
Você poderia me ajudar a encontrar uma solução para isso?
Solução
É bastante complicado, mas isso deve levá -lo mais longe. Você pode acessar o cache de consulta via sessionfactory; portanto, assumindo que você tenha acesso a isso (por exemplo, por 'Def SessionFactory'), então você pode chegar aos caches subjacentes como este:
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
}
Observe que os valores serão uma lista de valores longos. Não tenho certeza do que o primeiro significa (é um grande valor, por exemplo, 5219682970079232), mas os restantes são os IDs das instâncias da classe de domínio em cache.