开启mybatis开启二级缓存

Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。一级缓存是指SqlSession级别的缓存,当在同一个SqlSession中进行相同的SQL语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存1024条SQL。二级缓存是指可以跨SqlSession的缓存,是mapper级别的缓存,对于mapper级别的缓存不同的sqlsession是可以共享的,mapper以命名空间为单位创建缓存数据结构,需要手动开启。

一、开启二级缓存

和一级缓存默认开启不一样,二级缓存需要我们手动开启

1、开启缓存

首先在全局配置文件 mybatis-configuration.xml 文件中加入如下代码:


    
     

springboot配置开启二级缓存

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

2、在XXXmapper.xml文件中使用缓存



我们可以看到 mapper.xml 文件中就这么一个空标签,其实这里可以配置,PerpetualCache这个类是mybatis默认实现缓存功能的类。我们不写type就使用mybatis默认的缓存,也可以去实现 Cache 接口来自定义缓存。

    
        
        
        
        
    

二、useCache和flushCache

1、useCache
mybatis中还可以配置userCache和flushCache等配置项,userCache是用来设置是否禁用二级缓存的,useCache=false禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。

#禁用缓存

对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存,直接从数据库中获取。

在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。

2、flushCache

flushCache=”true”,默认情况下为true,即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。

#flushCache="true" 刷新缓存,flushCache="false" 不刷新缓存,可能出现脏读

一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。
所以我们不用设置,默认即可。

三、关于@CacheNamespace

@CacheNamespace注解主要用于mybatis二级缓存,等同于属性。但是在使用过程中要注意:

@CacheNamespace虽然xml配置和注解的功能基本相同,但是使用@CacheNamespace时候要注意:

配置文件和接口注释是不能够配合使用的。只能通过全注解的方式或者全部通过xml配置文件的方式使用,配合使用二级缓存会出问题,比如更新数据后不刷新缓存

见下面的例子:

//通过注解的方式使用二级缓存
@CacheNamespace(implementation = MybatisRedisCache.class)
public interface UserMapper(
    @Select("select * from t_user where user_id = #{userId}")
    @Options(useCache = true)
    List getUser(User u);
}
//通过配置文件的方式,使用二级缓存



 
    
        
        
        
        
    
 
    

四、mybatis二级缓存的局限性

mybatis二级缓存粒度不够细,他是以mapper为单位进行缓存的,比如对所有商品进行缓存,但是其中只有一个商品发生了更新,那么将会刷新所有的缓存,这时可以采用其他的方式进行缓存,比如第三方缓存redis等等。
开启mybatis开启二级缓存_第1张图片

参考链接:
http://www.mybatis.cn/archives/128.html
https://www.cnblogs.com/charlypage/p/9747145.html

你可能感兴趣的:(Spring,mybatis)