- Como a maioria das estruturas de persistência, o Mybatis também fornece uma estratégia de cache, que reduz o número de consultas ao banco de dados e melhora o desempenho.
- O cache no Mybatis é dividido em cache de primeiro nível e cache de segundo nível.
Cache de primeiro nível Mybatis
- O cache de primeiro nível é o cache do intervalo SqlSession. Quando os métodos de modificar, adicionar, excluir, confirmar (), fechar (), liberar () e outros métodos do SqlSession são chamados, o cache de primeiro nível será limpo.
-
Na primeira vez em que consultar as informações do usuário com o ID do usuário 1, localize primeiro se há informações do usuário com o ID 1 no cache; caso contrário, consulte as informações do usuário no banco de dados.
-
Obtenha informações do usuário e armazene-as no cache principal.
-
Se o sqlSession executar uma operação de confirmação (executar inserir, atualizar, excluir), limpe o cache de primeiro nível no SqlSession.O objetivo é permitir que o cache armazene as informações mais recentes e evite leituras sujas.
-
Na segunda vez para iniciar uma consulta de informações do usuário com o ID do usuário 1, primeiro verifique se há informações do usuário com o ID 1. No cache, se houver, obtenha informações do usuário diretamente do cache.
Cache secundário de Mybatis
-
O cache de segundo nível é um cache no nível do mapeador.Várias SqlSessions operam na mesma instrução SQL mapeada pelo mesmo Mapeador.Múltiplas SqlSessions podem compartilhar o cache de segundo nível.O cache do segundo nível é através de SqlSessions.
-
Diagrama de estrutura do cache secundário:
-
Primeiro, abra o cache secundário do mybatis. O sqlSession1 consulta as informações do usuário e as informações do usuário armazenam os dados da consulta no cache secundário.
-
Se o SqlSession3 executar o SQL no mesmo mapa do mapeador e confirmar, os dados na área de cache de segundo nível no mapa do mapeador serão limpos.
-
O sqlSession2, para consultar as mesmas informações do usuário que o sqlSession1, irá primeiro ao cache para descobrir se há dados, se houver dados diretamente do cache.
- Nota: Os dados armazenados no cache de segundo nível não são um objeto; portanto, os
User findById(int id);
valores de endereço dos dois objetos Usuário retornados duas vezes são diferentes.
Ativar e desativar o cache de segundo nível
- Etapa 1: Abra o cache de segundo nível no arquivo SqlMapConfig.xml
<settings>
<!-- 开启二级缓存的支持 -->
<setting name="cacheEnabled" value="true"/>
</settings>
- Como o valor de cacheEnabled é verdadeiro por padrão, essa etapa pode ser omitida sem configuração. True significa abrir o cache do segundo nível; false para desativar o cache do segundo nível.
- Etapa 2: configurar o arquivo de mapeamento do mapeador relacionado
<mapper namespace="cn.myp666.dao.IUserDao">
<!-- 开启二级缓存的支持 -->
<cache></cache>
</mapper>
<cache>
O rótulo indica que o mapa atual do mapeador usará o cache de segundo nível, e o padrão distinto depende do valor do espaço para nome do mapeador.
- Etapa 3: configurar o atributo useCache na instrução
<!-- 根据 id 查询 -->
<select id="findById" resultType="user" parameterType="int" useCache="true">
select * from user where id = #{uid}
</select>
- Defina useCache = ”true” na tag no arquivo de mapeamento UserDao.xml para indicar que a instrução atual é usar o cache de segundo nível.Se não for usado, poderá ser definido como false
- Nota: Para cada consulta que requer o sql de dados mais recente, useCache = false deve ser configurado para desativar o cache secundário.
Considerações para cache L2
- Quando usamos o cache secundário, a classe em cache deve implementar
java.io.Serializable
a interface, de modo que você pode usar para salvar o objeto de serialização.
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
}