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

3 respostas
K

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
<ehcache>
	 
	<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"/>       
	 
</ehcache>
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

3 Respostas

J

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

K

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

K

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

Criado 20 de outubro de 2012
Ultima resposta 24 de out. de 2012
Respostas 3
Participantes 2