Abra mybatis para abrir o cache secundário

Existem cache de primeiro nível e cache de segundo nível em Mybatis. Por padrão, o cache de primeiro nível está ativado e não pode ser desativado. O cache de primeiro nível refere-se ao cache de nível SqlSession. Quando a mesma consulta de instrução SQL é realizada no mesmo SqlSession, a segunda consulta e as subsequentes não serão consultadas no banco de dados, mas obtidas diretamente do cache. O cache de primeiro nível pode armazenar em cache até 1024 Artigo SQL. O cache de segundo nível se refere a um cache que pode abranger SqlSessions. É um cache de nível de mapeador. Para caches de nível de mapeador, diferentes sessões de sqls podem ser compartilhadas. O mapeador cria uma estrutura de dados de cache na unidade de um namespace e precisa ser aberto manualmente.

1. Ligue o cache secundário

Ao contrário do cache de primeiro nível que é habilitado por padrão, o cache de segundo nível precisa ser habilitado manualmente

1. Ligue o cache

Primeiro, adicione o seguinte código ao arquivo de configuração global mybatis-configuration.xml:

<!--开启二级缓存  -->
<settings>    
     <setting name="cacheEnabled" value="true"/>
</settings>

Configuração do Springboot para habilitar o cache secundário

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.demo.entity
  configuration:
    cache-enabled: true

2. Use o cache no arquivo XXXmapper.xml

<!-- 开启二级缓存 -->
<cache></cache>

Podemos ver que existe apenas uma tag vazia no arquivo mapper.xml. Na verdade, ela pode ser configurada aqui. A classe PerpetualCache é a classe que mybatis implementa a função de cache por padrão. Não escrevemos o tipo e usamos o cache padrão do mybatis, ou podemos implementar a interface do Cache para personalizar o cache.

    <cache type="org.apache.ibatis.cache.impl.PerpetualCache">
        <property name="eviction" value="LRU" />
        <property name="flushInterval" value="6000000" />
        <property name="size" value="1024" />
        <property name="readOnly" value="false" />
    </cache>

Dois, useCache e flushCache

1.
UseCache Mybatis também pode configurar itens de configuração como userCache e flushCache, userCache é usado para definir se deve desabilitar o cache de segundo nível, useCache = false desabilita o cache de segundo nível da instrução select atual, ou seja, cada consulta emitirá sql para consultar, o padrão A situação é verdadeira, ou seja, o SQL usa o cache de segundo nível.

#禁用缓存
<select id="selectUserByUserId" useCache="false" resultType="com.ys.twocache.User" parameterType="int">    
select * from user where id=#{id}
</select>

Para cada consulta, o sql de dados mais recente é necessário. Defina useCache = false, desative o cache de segundo nível e obtenha-o diretamente do banco de dados.

No mesmo namespace do mapeador, se houver outras operações de inserção, atualização e exclusão, o cache precisará ser atualizado e leituras sujas ocorrerão se o cache não for atualizado.

2 、 flushCache

flushCache = ”true”, que é true por padrão, o que significa atualizar o cache. Se for alterado para false, não será atualizado. Ao usar o cache, se você modificar manualmente os dados da consulta na tabela do banco de dados, ocorrerão leituras sujas.

#flushCache="true" 刷新缓存,flushCache="false" 不刷新缓存,可能出现脏读
<select id="selectUserByUserId" flushCache="true" useCache="false" resultType="com.ys.twocache.User" parameterType="int">    
select * from user where id=#{id}
</select>

Geralmente, o cache precisa ser atualizado após a operação de confirmação ser executada .flushCache = true indica que o cache é atualizado, o que pode evitar a leitura suja do banco de dados.
Portanto, não precisamos definir, o padrão é bom.

3. Sobre @CacheNamespace

A anotação @CacheNamespace é usada principalmente para o cache de segundo nível mybatis, que é equivalente a atributos. Mas preste atenção a:

@CacheNamespace Embora a configuração xml e as funções de anotação sejam basicamente as mesmas, você deve prestar atenção ao seguinte ao usar @CacheNamespace:

Arquivos de configuração e comentários de interface não podem ser usados ​​juntos. Ele só pode ser usado na forma de anotações completas ou todo o arquivo de configuração xml, e o uso do cache secundário causará problemas, como não atualizar o cache após atualizar os dados

Veja o exemplo abaixo:

//通过注解的方式使用二级缓存
@CacheNamespace(implementation = MybatisRedisCache.class)
public interface UserMapper(
    @Select("select * from t_user where user_id = #{userId}")
    @Options(useCache = true)
    List<User> getUser(User u);
}
//通过配置文件的方式,使用二级缓存
<?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="cn.mybatis.UserMapper">
 
    <cache type="cn.mybatis.MybatisRedisCache">
        <property name="eviction" value="LRU" />
        <property name="flushInterval" value="6000000" />
        <property name="size" value="1024" />
        <property name="readOnly" value="false" />
    </cache>
 
    <select id="selectById">
        select * from test where id = #{id}
    </select >
</mapper>

Quarto, as limitações do cache secundário mybatis

A granularidade do cache secundário mybatis não é boa o suficiente. Ele armazena em cache na unidade do mapeador. Por exemplo, se todos os produtos forem armazenados em cache, mas apenas um deles for atualizado, todos os caches serão atualizados. Nesse momento, outros métodos podem ser usados. Cache, como redis de cache de terceiros, etc.
Insira a descrição da imagem aqui

Link de referência:
http://www.mybatis.cn/archives/128.html
https://www.cnblogs.com/charlypage/p/9747145.html

Acho que você gosta

Origin blog.csdn.net/u011582840/article/details/108105540
Recomendado
Clasificación