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(); }
Se não me engano esse @cacheable é do spring, na versão mais nova do spring não precisa ser em uma interface… Eu acho
Dimi, primeiramente valeu pelo seu comentário =).
Mas o @Cacheable do método acima não é do Spring, é do proprio Ehcache mesmo. (com.googlecode.ehcache.annotations.Cacheable;)
E você tem razão, apartir do Spring 3.1 não precisa mais ser chamado apartir de uma interface, mas no caso do cacheable do EhCache sim.
Volte mais vezes e estou esperando um post seu =).
Abraços
Se não me engano essa annotation é do spring e no mais recente, não precisa mais ser uma interface…
Mas não tenho nenhuma certeza no que estou dizendo. Hahahahha