Cache de segundo nivel - Hibernate [RESOLVIDO]

Boa tarde a todos. Tenho muitas duvidas em relacao ao meu projeto, a de momento e referente ao cache de segundo nivel. Nao tenho muita certeza se a estrategia
que tomei e a correta, se esta me ajudando ou se ao inves disso esta gastando mais memoria. Vou expor a situacao e as duvidas.

Tenho uma Entidade Categoria, que por sua vez tem uma lista de SubCategoria. Em todas as telas do meu projeto faco uso de todas as categorias com suas
respectivas subcategorias persistidas no banco. Sendo assim acho que seria viavel alem de deixar um relacionamento do tipo EAGER entre as duas, fazerum cache de segundo nivel pra essa lista de categorias. o que voces acham dessa estrategia?? Porque eu achar viavel nao quer realmente dizer seja, por isso a opniao de voces seria
muito bem-vinda.

Ate implementei esse cache de segundo nivel mas me parece que nao esta funcionando.

sql’s gerado pelo hibernate no primeiro acesso a lista


Hibernate: 
    select
        this_.id_categoria as id1_3_1_,
        this_.nome as nome3_1_,
        subcategor2_.id_categoria as id3_3_,
        subcategor2_.id_sub_categoria as id1_3_,
        subcategor2_.id_sub_categoria as id1_4_0_,
        subcategor2_.nome as nome4_0_,
        subcategor2_.id_categoria as id3_4_0_ 
    from
        categoria this_ 
    left outer join
        sub_categoria subcategor2_ 
            on this_.id_categoria=subcategor2_.id_categoria

segundo acesso a lista vem a mesma coisa


Hibernate: 
    select
        this_.id_categoria as id1_3_1_,
        this_.nome as nome3_1_,
        subcategor2_.id_categoria as id3_3_,
        subcategor2_.id_sub_categoria as id1_3_,
        subcategor2_.id_sub_categoria as id1_4_0_,
        subcategor2_.nome as nome4_0_,
        subcategor2_.id_categoria as id3_4_0_ 
    from
        categoria this_ 
    left outer join
        sub_categoria subcategor2_ 
            on this_.id_categoria=subcategor2_.id_categoria

e aqui estao as configuracoes referentes as classes cacheadas e xmls

Classe Categoria


@Entity
@Table
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class CategoriaPeca extends model.Entity {

     	@OneToMany(mappedBy = "categoria", targetEntity = SubCategoriaP.class, fetch = FetchType.EAGER)
	@Cascade(CascadeType.ALL)
	@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
	private List<SubCategoriaPeca> subCategoriaPecas;


}

ehcache.xml


<ehcache>
	
	<diskStore path="java.io.tmpdir" />
	
	<cache 
		name="model.Categoria"
		maxElementsInMemory="100"
		eternal="false"
		timeToIdleSeconds="300"
		timeToLiveSeconds="600"
		overflowToDisk="false" />
	
	<defaultCache 
		maxElementsInMemory="500"
		eternal="false"
		timeToIdleSeconds="120"
		timeToLiveSeconds="120"
		overflowToDisk="false" />
	
</ehcache>

hibernate.cfg.xml


<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>

pesquisei bastante atras de algum erro, nao sei passou despercebido mas nao encontrei, qualquer ajuda e de grande valos…

Quanto à usar ou não cache: Se essas entidades realmente tem um perfil mais de leitura do que de escrita, e são usadas em vários pontos do sistema, na minha opnião vale a pena sim!A não ser que sejam entidades muito grandes e seu serivdor não possui muita memória.

Outro ponto a considerar é a questão de cache distribuído caso sua app rode em mais de uma máquina/instância, mas o EhCache tem suporte à essa feature também.

Quanto ao funcionamento, realmente está faltando algo, pois na segunda consulta não deveria executar o SQL.
Estou sem código aqui para dar uma conferida (já fiz algo parecido), mas seguem alguns pontos pra você analisar:
-A entidade SubCategoriaPeca também deve estar no arquivo de configurações do echache
-Se não me engano, o próprio relacionamento também deve estar no arquivo de configurações do echache
-Uma dúvida: Como você está carregando as entidades?Lembrando que se estiver usando Query, deve setar a query como setCacheable() e habilitar o cache de queries no arquivo de configuração do hibernate.

Espero ter ajudado.

Cara muito grato por sua ajuda, fiz oq me pediu e resolvi o problema.

A solucao do meu problema…

configurei cache pra entidade subcategoriapeca no ehcache.xml


<cache 
		name="model.CategoriaPeca"
		maxElementsInMemory="30"
		eternal="false"
		timeToIdleSeconds="300"
		timeToLiveSeconds="600"
		overflowToDisk="false"
		statistics="true" />
		
	<cache 
		name="model.SubCategoriaPeca"
		maxElementsInMemory="50"
		eternal="false"
		timeToIdleSeconds="300"
		timeToLiveSeconds="600"
		overflowToDisk="false"
		statistics="true" />
				
	
	<defaultCache 
		maxElementsInMemory="200"
		eternal="false"
		timeToIdleSeconds="120"
		timeToLiveSeconds="120"
		overflowToDisk="false"
		statistics="true" />

habilitei o cache de query no hibernate.cfg.xml


<property name="hibernate.cache.use_query_cache">true</property>

anotei minha classe subcategoriapeca com @Cache (nao sabia que precisava)


@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class SubCategoriaPeca extends model.Entity {

luciano estou buscando uma lista de entidades com criteria

passei de…


session.creatCriteria(Entidade.class).list()

para…


session.creatCriteria(Entidade.class).setCacheable(true).list()

e funcionou.

Agora uma duvida. Todas as entidades do sistema usam o mesmo metodo para listar, ate aquelas que nao fazem uso de cache. Haveria algum problema nisso pelo fato do setCacheable(true)??

cara muito obrigado mesmo pela atencao…

Opa, que bom que deu certo! :slight_smile:

Sobre você sempre definir com setCacheable(true) mesmo que não for usar cache eu acredito que não tenha problemas, mas é bom ir testando e acompanhando…na pior das hipóteses cria um método para listar usando cache e outro sem.

Optei por sobrescrever o metodo pra listar tudo nas entidades que vao usar cache. Valeu pela ajuda cara, resolveu meu problema.

Obs: como coloco [RESOLVIDO] no post que criei, hahahaha, nunca soube e nunca perguntei isso.

Cara, para colocar como resolvido acho que é só clicar em editar e colocar o [RESOLVIDO] no título.

Alguém aqui conseguiu configurar o ehcache com hibernate 4

Estou usando Entity Manager (mas acredito que a configuração seja a mesma)

segue meu persistente.xml:

<!-- EhCache: --> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/> <property name="net.sf.ehcache.configurationResourceName" value="/ehcache.xml"/> <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/> <property name="hibernate.cache.use_query_cache" value="true"/> <property name="hibernate.cache.use_structured_entries" value="true"/> <property name="hibernate.cache.use_second_level_cache" value="true"/>

Estou usando na entity:

Criei session hibernate para poder usar o criteria
e nas minhas criteria estou colocando dese jeito

criteia.setCacheable(true).list();

não está gerando nenhum erro, mas o cache não está funcionando pq as query é executada toda vez

Alguem já passou por isso?

@tmvolpato,

Você conseguiu configurar o ehcache com hibernate 4. Estou passando pelo mesmo problema.

Desde já, Obrigado!

Não consegui
tentei de tudo,

Não gerava nenhum erro no log
fiz vário testes e nada de ehcache

e tbm não encontrei ngm que conseguiu funcionar com hibernate 4

se acha algum coisa me dá um toque e testamos juntos

flw

[quote=nandooliveira]@tmvolpato,

Você conseguiu configurar o ehcache com hibernate 4. Estou passando pelo mesmo problema.

Desde já, Obrigado![/quote]