1. Introdução ao cache mybatis
Assim como a maioria das estruturas de camadas de persistência, o Mybatis também fornece suporte para caches L1 e L2.
1. Cache de Nível 1:
O cache local Hashmap baseado no PerpetualCache possui um escopo de armazenamento da sessão. Após a descarga da sessão, todos os caches na sessão serão limpos.
2. Cache de Nível 2:
O cache de segundo nível é o mesmo que o cache de primeiro nível, e o padrão é o perpetualcache e o armazenamento de hashmap. A diferença é que seu escopo de armazenamento é o Mapper (namespace) e pode personalizar a fonte de armazenamento, como o ehcache.
3. Para o mecanismo de atualização de dados do cache , quando um determinado escopo (namespaces de cache de cache de primeiro nível/namespaces de cache de segundo nível) é executado, todos os caches em seleções sob este escopo serão limpos por padrão.
1.1. Teste de cache de nível 1 de Mybatis
package me.gacl.test;import me.gacl.domain.User;import me.gacl.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.junit.Test;/*** @author gacl* Test first-level cache*/public class TestOneLevelCache {/** Level 1 cache: Session-level cache (on por padrão)*/@testpublic void testCache () {SqlSession Session = mybatisutil.getSqlSession (); String declaration = "me.gacl.mapping.userMapper.getUser"; usuário user = session.selectOne (declaração); system.out.println (user);/**); ); System.out.println (user); session.close ();/*. Deve ser a mesma sessão. Se o objeto de sessão foi fechado (), é impossível usá -lo */session = mybatisutil.getSqlSession (); user = session.SelectOne (declaration,); system.out.println (usuário);/ *. As condições de consulta são as mesmas */user = session.SelectOne (declaration,); System.out.println (Usuário);/ *. Não session.clearcache () foi executado para limpar o cache*/// session.clearcache (); User = session.SelectOne (Declaração,); System.out.println (Usuário);/*. Nenhuma operações de adição/exclusão foi executada (essas operações limparão o cache)*/session.Update ("me.gacl.mapping.usermapper.updateuser", novo usuário (, "usuário",)); usuário = session.selectOne (declaração,); system.out.println (usuário);}} 1.2. Teste de cache de nível 2 mybatis
1. Ligue o cache secundário e adicione a seguinte configuração ao arquivo UserMApper.xml
<Mapper Namespace = "me.gacl.mapping.userMapper"> <!-LIGUE ON Nível 2 Cache-> <cache/>
2. Teste o cache secundário
pacote me.gacl.test; importar me.gacl.domain.User; importe me.gacl.util.mybatisutil; importar org.apache.ibatis.session.sqlSession; importação org. TesttWolevelCache {/** Cache do nível 2* Use dois objetos diferentes de SQLSession para executar consultas com as mesmas condições de consulta. As instruções SQL não serão enviadas durante a segunda consulta, mas os dados são obtidos diretamente no cache*/@testpublic void testCache () {string declaration = "me.gacl.mapping.userMapper.getUSSion"; sqlSessionFactory Factory = mybatisutil.stisionSessionSession; Factory.opensssession (); SQLSession Session = Factory.opensssession (); // Ao usar o cache secundário, a classe de usuário deve implementar uma interface serializável ===> implementa o usuário serializável user = session.SelectOne (Declaração); Sessão.Commit (); Antes de que eu não entenda o porquê. System.out.println ("user ="+user); // porque dois objetos diferentes de SQLSession são usados, mesmo que as condições de consulta sejam iguais, o cache de primeiro nível não será ativado. user = session.SelectOne (Declaração,); // session.Commit (); System.out.println ("user ="+user);}} 1.3. Instruções suplementares para cache secundário
1. Todas as instruções selecionadas no arquivo de declaração de mapeamento serão armazenadas em cache.
2. Mapeie todas as instruções de inserção, atualização e exclusão no arquivo de instrução atualizará o cache.
3. O cache será julgado usando o algoritmo menos usado recentemente (LRU, o menos recentemente usado).
4. O cache será atualizado de acordo com o intervalo de tempo especificado.
5. O cache armazenará 1024 objetos
Propriedades comuns de tags de cache:
<cache despettion = "fifo" <!-A estratégia de reciclagem é o primeiro a entrar, primeiro a sair-> flushinterval = "60000" <!-Tempo automático de atualização 60s-> size = "512" <!-cache até 512 objetos de referência-> readonly = "true"/> <!-Read-inly->
Vou te dar algum conhecimento:
Como o Hibernate, Mybatis também tem um mecanismo de cache
O cache do nível 1 é baseado no cache local do Hashmap de Perpetualcache (Mybatis vem) e seu escopo é sessão; portanto, quando a sessão se compromete ou fechará, o cache será limpo.
O cache de segundo nível também é baseado no PerpetualCache por padrão, mas pode ser usado para criar fontes de armazenamento, como o Ehcache.
As instruções SQL de cache de cache de primeiro nível, enquanto o cache de cache de segundo nível cache o objeto de resultado. Veja o exemplo a seguir (o nível de log da Mybatis está definido como depuração)