Hybernate + Spring + EhCache - que surra![RESOLVIDO]

Pessoal, depois que migrei para o Spring 3 meu cache deixou de funcionar. É claro que eu reconfigurei tudo. E está tudo certinho (penso eu), no entanto as queries continuam no console após a segunda chamada.

Spring:

<!-- Configuracoes cache --> <prop key="hibernate.cache.provider_class"> net.sf.ehcache.hibernate.EhCacheProvider</prop> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> <prop key="net.sf.ehcache.configurationResourceName">/ehcache.xml</prop> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.use_structured_entries">true</prop> <prop key="hibernate.cache.use_query_cache">true</prop>

ehcache.xml

[code]

<diskStore path="java.io.tmpdir"/>
 
<!-- (default) Requerido -->
<defaultCache
	eternal="false"
	maxElementsInMemory="1000"		
	timeToIdleSeconds="120"
	timeToLiveSeconds="120/>

<cache 
	name="org.hibernate.cache.internal.StandardQueryCache"
	eternal="false"
	maxElementsInMemory="100"		
	timeToIdleSeconds="120"
	timeToLiveSeconds="120"
	overflowToDisk="false"/>	 	

<cache    	
	name="org.hibernate.cache.spi.UpdateTimestampsCache"
	eternal="true"
	maxElementsInMemory="1000"/>    

<cache 
	name="meuPacote.Cidade"
	maxElementsInMemory="100" 
	eternal="false" 
	timeToIdleSeconds="300"
	timeToLiveSeconds="600" 
	overflowToDisk="false"/>       
[/code]

Entidade:

@Entity (name="Cidade") @NamedQueries({ @NamedQuery(name="cidades", query="select a from Cidade a order by a.nome") }) @Table (schema="public", name="cidade") @Cache(usage = CacheConcurrencyStrategy.READ_ONLY) public class Cidade { ... }

  • O EhCache reconhece a entidade cacheada (o log evidencia isto).
  • Não há erro no console.

Então, pode ser que eu tenha feito algo errado ou me esqueci de configurar alguma coisa, ou então estou completamente errado na abordagem.

Se alguém puder me ajudar, agradeceria muito, porque o chefe já está em cima de mim: “JÁ FEZ?, JÁ CONSEGUIU?” E há dois dias estou tentando consertar.

Estou usando:
Hibernate 4.1.6
Spring 3.1
EhCache-core-2.6.0

Abraços a todos

Boa noite knik, tudo bem?

Quando vc colocar @Cache nas suas entidades você está habilitando o cache em consultas por id da entidade. Ou seja, “select * from entidade where id = 1” seria cacheada, mas “select * from entidade” nao seria cacheada.

Para que a segunda query seja cacheada vc deve habilitar o cache de queries do hibernate.

De uma olhada neste link para ver se ele te esclarece alguma coisa: http://blog.dynatrace.com/2009/02/16/understanding-caching-in-hibernate-part-two-the-query-cache/

A documentação do hibernate também explica bem este conceito: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-querycache

Abs

Obrigado.
Esclareceu bem, o problema é que houveram várias modificações no nosso código e a mais dramática foi a troca do Query do Hibernate para o da JPA nativa, portanto perdemos o método setCacheable (na JPA não tem).
Acho que teremos de reconfigurar novamente.
De qualquer forma, valeu pela dica.
abcs

Resolvido utilizando org.springframework.cache.ehcache.EhCacheCacheManager, que provê mecanismos de cache de segundo nível bem superior ao simples da JPA pura.