[Mybatis da entrada ao tutorial de combate real] Capítulo 7 Explicação Detalhada do Mybatis Query Cache

Sete, cache de consulta Mybatis

    Cache: Armazenar dados temporariamente em mídia de armazenamento (memória, arquivos).O objetivo do cache em bancos de dados relacionais é reduzir a pressão sobre o banco de dados.
    
    Os dados do banco de dados são realmente armazenados no disco rígido.Se nosso programa precisar usar dados, ele precisará ler os dados do disco com frequência, o que é ineficiente e coloca muita pressão no banco de dados. Podemos armazenar em cache os dados consultados, o que reduz a operação frequente dos dados do disco, melhora a eficiência da consulta e reduz a pressão do servidor.
    
    Mybatis fornece cache de consulta para reduzir a pressão do banco de dados e melhorar o desempenho do banco de dados. No entanto, no desenvolvimento real do projeto, o mecanismo de cache do Mybatis raramente é usado. Agora, o mecanismo de cache principal é o redis.

7.1 O que é cache de consulta

  • MyBatis fornece cache de consulta para reduzir a pressão do banco de dados e melhorar o desempenho do banco de dados;

  • MyBatis fornece cache de primeiro nível e cache de segundo nível;

  • O cache de primeiro nível é o cache no nível SqlSession. Ao operar o banco de dados, é necessário construir um objeto SqlSession, e há uma estrutura de dados (HashMap) no objeto para armazenar dados em cache. A área de dados do cache (HashMap) entre diferentes SqlSessions não afeta uma à outra;

  • O cache de segundo nível é um cache de nível de mapeador.Múltiplas SqlSessions operam a instrução SQL do mesmo mapeador.Múltiplas SqlSessions podem compartilhar o cache de segundo nível, e o cache de segundo nível está entre SqlSessions;

7.2 Cache nível 1

7.2.1 Princípio de funcionamento do cache de nível 1

  • Na primeira vez que você consultar os dados com id 1, vá primeiro ao cache de primeiro nível para descobrir se existem dados com id 1, caso contrário, consulte os dados do banco de dados e armazene os dados no cache de primeiro nível;

  • Na segunda vez para consultar os dados com id 1, primeiro vá para o cache de primeiro nível para descobrir se há dados com id 1, se houver no cache, obtenha os dados diretamente do cache e não consulte mais o base de dados;

  • Se o SqlSession executar uma operação de confirmação (inserir, atualizar, excluir), ele limpará o cache de primeiro nível no SqlSession.O objetivo disso é armazenar os dados mais recentes no cache e evitar leitura suja;

7.2.2 Classes de entidade

public class Person {

    private Integer id;
    private String personName;
    private Integer personAge;
    private String personAddress;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getPersonName() {
        return personName;
    }

    public void setPersonName(String personName) {
        this.personName = personName;
    }

    public Integer getPersonAge() {
        return personAge;
    }

    public void setPersonAge(Integer personAge) {
        this.personAge = personAge;
    }

    public String getPersonAddress() {
        return personAddress;
    }

    public void setPersonAddress(String personAddress) {
        this.personAddress = personAddress;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", personName='" + personName + '\'' +
                ", personAge=" + personAge +
                ", personAddress='" + personAddress + '\'' +
                '}';
    }
}

7.2.3 interface do mapeador

public interface PersonMapper {

    Person selectById(Integer id);

    List<Person> select();
}

7.2.4 arquivo mapeador

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newcapec.mapper.PersonMapper">

    <select id="selectById" parameterType="java.lang.Integer" resultType="com.newcapec.entity.Person">
        select id,person_name,person_age,person_address from person where id=#{id}
    </select>

    <select id="select" resultType="com.newcapec.entity.Person">
        select id,person_name,person_age,person_address from person
    </select>
</mapper>

7.2.5 Teste

public class CacheTest {

    @Test
    public void testSqlSessionCache() {
        SqlSession sqlSession = MybatisUtil.getSession();
        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);

        System.out.println("----------第一次使用id为1的person数据-----------");
        Person p1 = personMapper.selectById(1);
        System.out.println(p1);

        /**
         * 一级缓存自带缓存,不可不用的,缓存介质为内存
         * commit()提交方法可以请求缓存
         */
        //sqlSession.commit();

        System.out.println("----------第二次使用id为1的person数据-----------");
        Person p2 = personMapper.selectById(1);
        System.out.println(p2);

        sqlSession.close();
    }
}

7.3 Cache de segundo nível

7.3.1 Princípio de Funcionamento do Cache L2

  • SqlSession1 para consultar os dados cujo id é 1 e armazenar os dados no cache secundário após a consulta;

  • SqlSession2 para consultar os dados cujo id é 1, para saber se há dados no cache, se houver, busque diretamente os dados do cache;

  • Se SqlSession3 executar sql no mesmo mapeador, executar o envio de confirmação e limpar os dados na área de cache secundária no mapeador;

  • A diferença entre o cache de segundo nível e o cache de primeiro nível é que o escopo do cache de segundo nível é maior e várias SqlSessions podem compartilhar a área de cache de segundo nível de um mapeador;

  • Cada mapeador possui uma área de cache de segundo nível, dividida por namespace;

  • Se os namespaces dos dois mapeadores forem iguais, os dois mapeadores executarão consultas SQL e os dados serão armazenados na mesma área de cache secundária;

7.3.2 Habilitar cache L2

Configure no arquivo de configuração do núcleo mybatis: cacheEnabled

itens de configuração descrever mesada Padrões
cache ativado Configurações globais de ativação/desativação para todos os caches neste arquivo de configuração verdadeiro falso verdadeiro
<!-- 全局参数设置 -->
<settings>
    <!-- 开启二级缓存-->
    <setting name="cacheEnabled" value="true"/>
</settings>

Abra o segundo cache no arquivo de mapeamento e o SQL em mapper.xml será armazenado em sua área de cache HashMap após a conclusão da execução do SQL.

<mapper namespace="com.newcapec.mapper.PersonMapper">
    <!-- 配置当前mapper文件中所有查询语句都放入二级缓存中 -->
    <cache/>
    
    <select>
        ...
    </select>
</mapper>

7.3.3 Classes de entidade

    A classe de entidade que armazena dados no cache de segundo nível deve implementar a interface serializável java.io.Serializable.

public class Person implements Serializable {
    
}

7.3.4 Teste de cache L2

@Test
public void testMapperCache(){
    /**
     * 二级缓存,可插拔式缓存,缓存介质:内存+磁盘
     */

    SqlSession sqlSession1 = MybatisUtil.getSession();
    PersonMapper personMapper1 = sqlSession1.getMapper(PersonMapper.class);
    System.out.println("-------------第一次查询--------------");
    Person p1 = personMapper1.selectById(2);
    System.out.println(p1);
    sqlSession1.close();

    System.out.println("----------------sqlSession1关闭,建立sqlSession2连接-------------------");

    SqlSession sqlSession2 = MybatisUtil.getSession();
    PersonMapper personMapper2 = sqlSession2.getMapper(PersonMapper.class);
    System.out.println("-------------第二次查询--------------");
    Person p2 = personMapper2.selectById(2);
    System.out.println(p2);
    sqlSession2.close();
}

7.3.5 configuração useCache

    Definir useCache="false" na instrução pode desabilitar o cache de segundo nível da instrução select atual, ou seja, cada consulta enviará sql para consulta. O padrão é verdadeiro, ou seja, o SQL usa o cache de segundo nível.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.newcapec.mapper.PersonMapper">

    <!-- 配置当前mapper文件中所有查询语句都放入二级缓存中 -->
    <cache/>

    <select id="selectById" parameterType="java.lang.Integer" resultType="com.newcapec.entity.Person" useCache="true">
        select id,person_name,person_age,person_address from person where id=#{id}
    </select>

    <!-- select标签中的useCache属性: 决定了当前sql是否使用二级缓存,默认为true -->
    <select id="select" resultType="com.newcapec.entity.Person" useCache="false">
        select id,person_name,person_age,person_address from person
    </select>
</mapper>

teste:

@Test
public void testMapperCache2() {
    SqlSession sqlSession1 = MybatisUtil.getSession();
    PersonMapper personMapper1 = sqlSession1.getMapper(PersonMapper.class);
    System.out.println("-------------第一次查询--------------");
    List<Person> list1 = personMapper1.select();
    System.out.println(list1);
    sqlSession1.close();

    System.out.println("----------------sqlSession1关闭,建立sqlSession2连接-------------------");

    SqlSession sqlSession2 = MybatisUtil.getSession();
    PersonMapper personMapper2 = sqlSession2.getMapper(PersonMapper.class);
    System.out.println("-------------第二次查询--------------");
    List<Person> list2 = personMapper2.select();
    System.out.println(list2);
    sqlSession2.close();
}

Acho que você gosta

Origin blog.csdn.net/ligonglanyuan/article/details/124419889
Recomendado
Clasificación