美文网首页Spring Boot学习
mybatis一级缓存和二级缓存

mybatis一级缓存和二级缓存

作者: 今昔何昔jxhxblog | 来源:发表于2020-03-18 21:35 被阅读0次

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

    一级缓存:

    MyBatis

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

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

    二级缓存

    二级缓存是需要手动开启

    <settings>
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true" />
    </settings>
    
    在这里插入图片描述

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

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

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

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

    二级缓存使用注意事项

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

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



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

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

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

    相关文章

      网友评论

        本文标题:mybatis一级缓存和二级缓存

        本文链接:https://www.haomeiwen.com/subject/efhhyhtx.html