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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top