Problemas utilizando query cache (ehcache) jpa-hibernate

Pessoal, estou tentando cachear as seguintes entidades utilizando o 2nd level cache do hibernate (ehcache) : Estado e Cidade. Elas são read-only e só preciso traze-las do banco 1x. Elas são carregadas via Query (jpa), portanto preciso usar o query cache, porém não estou conseguindo fazer esse bendito cache funcionar. Já tentei os seguintes cenários de configuração:
A) Criar 1 cache para estas queries no arquivo ehcache.xml e setar os hints necessáros no objeto query (org.hibernate.cacheable e org.hibernate.cacheRegion) :

<cache name="eternalQueryCache" maxElementsInMemory="1000" eternal="true"/>
Não funcionou e toda hora que carrego a página, a consulta é realizada. Na primeira vez que a consulta é realizada, a seguinte linha foi impressa no console:

INFO: starting query cache at region: eternalQueryCache

B) Em complemento ao item anterior, foi adicionada a anotação @Cache(usage = CacheConcurrencyStrategy.READ_ONLY) nestas entities. O cache mostrou algum sinal de vida heheh, porém, não o cache de queries, mas sim o cache default (copiei do ehcache-failsafe.xml existente no jar do ehcache). A consulta é executada a primeira vez, e ao ser chamada novamente, os objetos são trazidos do cache e não há chamada ao banco (o sql não é impresso no console). Porém após os 60 segundos configurados no cache default, a consulta é executada novamente.

<defaultCache maxElementsInMemory="1000"
                  eternal="true"
                  timeToIdleSeconds="60"
                  timeToLiveSeconds="60"
                  overflowToDisk="false"
                  diskPersistent="false"
                  diskExpiryThreadIntervalSeconds="120"
                  memoryStoreEvictionPolicy="LRU" />

Bem, gostaria da opnião de vcs a respeito dessa solução para este tipo de caso, e se seria o mais eficaz? Acredito que devo substituir a Query por uma named query também… Bem obrigado por qualquer possível ajuda. []'s.

dentre as diversas fontes que dei uma lida hoje, estou vendo agora http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html#performance-querycache.

Bem pessoal eu consegui alcançar o objetivo da seguinte forma:
Criei 1 cache para cada entidade:

<cache name="br.com.dho.model.entity.Estado"
           maxElementsInMemory="100"
           eternal="true"/>

    <cache name="br.com.dho.model.entity.Cidade"
           maxElementsInMemory="100"
           eternal="true"/>

Desta forma, mesmo eu obtendo elas via query, o cache está guardando e atendendo a minha necessidade. Retirei a configuração anterior do “eternalQueryCache”. Se alguém tiver alguma idéia do porque o cenário anterior não funcionou por favor compartilhe hehe. []'s.

No Hibernate, existem dois niveis de cache para entidades, como vc deve saber:

  1. Cache de primeiro nivel - Este cache eh um cache simples, usado somente no contexto de uma sessao. Ou seja, fechou a sessao, limpou o cache (ou qndo vc executa a operacao clear() no objeto Session ou EntityManager)
  2. Cache de segundo nivel - Este cache eh o cache que sobrevive mesmo depois de uma sessao ter sido fechada, ou mesmo depois da JVM ter terminado. Precisa ser usado um software externo para gerencia-lo.

Alem do cache de primeiro e segundo nivel para entidades, tem-se ainda o cache de consultas (query cache), que nunca deve ser usado, a menos que se tenha reais problemas de performance. O motivo eh que ele eh especifico para uma query e eh apagado sempre que alguma das tabelas envolvidas na consulta sofre mudancas atraves do Hibernate. As vezes, este cache pode ser ateh prejudicial, pq a cada operacao que vc faz, o Hibernate precisa checar se o cache deve ser invalidado. Alem disso, antes de usar o conteudo do query cache, ele faz outra verificacao (usando a regiao updateTimestamps) para saber se o resultado ainda eh util. Entao, as vezes eh mais rapido ir ao banco de dados do que usar query cache. Para usar query cache, vc precisa configurar o parametro hibernate.cache.use_query_cache, precisa configurar uma regiao no cache e precisa adicionar uma QueryHint na sua consulta. Como se isso tudo ja nao bastasse, existia um bug na logica para busca dos resultados caso o cache tenha sido criado na mesma sessao. Se quiser um exemplo de como configurar, baixe o pacote querycachebug.tar.gz neste link: https://jira.jboss.org/browse/JBPAPP-4224 .

Mas pela sua descricao, vc nao quer usar query-cache. Voce quer usar um 2L cache para entidades, coisa que vc aparentemente ja conseguiu.

Obrigado pela dica partenon, como vc disse, o query cache deve ser utilizado somente em última instância ( http://tech.puredanger.com/2009/07/10/hibernate-query-cache/ ). O alvoroço todo aconteceu porque a idéia que eu tinha era de que, como eu estou obtendo essas entidades via query, elas não seriam cacheadas num cache convencional, então por isso estava preocupado com este cache de query. []'s