mybatis一级缓存和二级缓存

MyBatis官网
MyBatis拥有自带一级缓存和二级缓存

一级缓存:

MyBatis

MyBatis是默认开启一级缓存,一级缓存是指session缓存,它的作用域是一个sqlSession对应着一个缓存空间。

当你再同一个sqlSession执行sql时,第一次会查询数据库,写入到缓存中,第二次会先去缓存中获取,没有命中就再次查询数据库。
当执行增删改的操作时,MyBatis会把SqlSession对应的缓存清空。
Spring项目中一个Mapper文件对应着一个SqlSession。

二级缓存

二级缓存是需要手动开启


    
    

在这里插入图片描述

二级缓存是在一级缓存的基础上开启多个SqlSession对应缓存空间共享

这样我就可以在第一个SqlSession执行一条查询语句时会去数据库中读取 并存入对应的缓存空间,第二个SqlSession执行同一条查询语句时会先去所有的SqlSession对应的缓存空间中获取数据。

值得一提的是 当一个SqlSession执行增删改的时候,他只会清空自己对应的缓存空间,假如第一个缓存中存储的name叫"小明"
第二个SqlSession执行修改操作改为name"小红",然后执行查询语句会命中第一个缓存中的"小明" 这就会造成脏读。

解决办法
如果是两个mapper命名空间的话,可以使用 来把一个命名空间指向另外一个命名空间,从而消除上述的影响,再次执行,就可以查询到正确的数据。

二级缓存使用注意事项

  1. 缓存是以为单位的,不同SqlSession下的操作互不影响。
  2. insert,update,delete操作会清空所在SqlSession下的全部缓存。
  3. 通常使用MyBatis Generator生成的代码中,都是各个表独立的,每个表都有自己的SqlSession。
  4. 多表操作一定不要使用二级缓存,因为多表操作进行更新操作,一定会产生脏数据。

Spring 项目中一个SqlSession等同于一个namespace。



如果你遵守二级缓存的注意事项,那么你就可以使用二级缓存。

但是,如果不能使用多表操作,二级缓存不就可以用一级缓存来替换掉吗?而且二级缓存是表级缓存,开销大,没有一级缓存直接使用 HashMap 来存储的效率更高,所以二级缓存并不推荐使用。

参考文章
MyBatis 二级缓存全详解

你可能感兴趣的:(mybatis一级缓存和二级缓存)