Pessoal, hoje vamos fazer o cache de um select utilizando o Ehcache.

O EHCache é o framework default de cache do Hibernate. Para utilizá-lo basta colocar o ehcache.jar no classpath da aplicação.

A idéia consiste em fazer com que toda vez que uma informação for solicitada a base de dados, uma vez que eu tenho um método findAll() que é responsável por trazer todos os resultados de uma tabela e armazená-los em uma lista, esse resultado do select seja “cacheado” para que eu não precise fazer consultas repetidas cada vez que o método é acessado.

Agora vamos configurar o arquivo ehcache.xml:

<ehcache>
	<defaultCache
      maxElementsInMemory="500"
      eternal="true"
      overflowToDisk="false"
      memoryStoreEvictionPolicy="LRU" />

	<cache name="roundingRule"
           maxElementsInMemory="10000"
           eternal="false"
           timeToIdleSeconds="1200"
           timeToLiveSeconds="1200"
           overflowToDisk="false"
           diskPersistent="false"
           diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU" />
</ehcache>
	

Utilizaremos o cache no método findAll():

@Override
	@Cacheable(cacheName = "regra")
	public ListRoundingRule findAll() {
		ListRoundingRule roundingRuleList = super.findAll();
		
		Collections.sort(roundingRuleList);
		
		return roundingRuleList;
	}

Para que o cache funcione para o método findAll(), devemos chamá-lo apartir da interface, ou seja, se esse método for chamado apartir de um outro método o cache não será feito.

Por exemplo no meu service o método ficaria assim:

public Double getRoundedPrice( double price ) {
		log.info( "INICIO - Arredondamento de Preco:"  + price );
		
                //O método a ser cacheado deve ser chamado direto pela interface, passando a chamada como paramêtro do método
                //antes o findAll() era chamado dentro do metodoX e dessa forma o cache não funcionava.
		return minhaInterface.metodoX( param1, roundingRuleRepository.findAll() ).getRoundedPrice();		
	}