• 面试题之MyBatis缓存


    MyBatis缓存

    • 什么是MyBatis缓存:

      Mybatis中有一级缓存和二级缓存。一级缓存又被称为本地缓存,是Session会话级别的,一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下一级缓存是开启的,而且是不能关闭的。二级缓存是针对mapper进行的缓存,它的生命周期很长,跟Application的生命周期一样,也就是说它的作用范围是整个Application应用

    • 一级缓存的原理:
      • 未开启二级缓存时图解:

      • 工作机制:

        一般而言,一个SqlSession对象会使用一个Executor对象来完成会话操作,Executor对象会维护一个Cache缓存,以提高查询性能。

      • 步骤:

      1. 第一次发出一个查询的 sql 语句,查询结果写入sqlsession的一级缓存中,缓存使用的数据结构是一个map
      • key:MapperID + offset + limit + Sql + 传入的参数

      • value:用户信息

      1. 同一个sqlsession再次发出相同的 sql 语句,就从缓存中取出数据

      2. 如果两次中间出现commit 操作(修改、添加、删除),close(),clearCache()等方法时,这次sqlsession中的一级缓存区域全部清空,下次再去缓存中查询不到,所以要从数据库查询,从数据库查询到再写入缓存

    • 二级缓存原理:
      • 如何开启二级缓存?

        SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口

        1. Mybatis全局配置中启用二级缓存配置
        2. 在对应的 Mapper.xml 中配置cache节点
        3. 在对应的select查询节点中添加useCache=true
      • 开启二级缓存时图解:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O63oOZPl-1660808626880)(C:\Users\10642\AppData\Roaming\Typora\typora-user-images\image-20220818153626199.png)]

      • 工作机制:

        在一级缓存中,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。

      • 注意:需要关闭一级缓存,即调用SqlSession的close()方法后,才能从二级缓存中查数据

      • 步骤:

      1. 二级缓存的范围是mapper级别(mapper同一个命名空间),mapper以命名空间为单位创建缓存数据结构,结构是map
      2. mybatis 的二级缓存是通过 CacheExecutor 实现的。CacheExecutor 其实是 Executor 的代理对象。所有的查询操作,在 CacheExecutor 中都会先匹配缓存中是否存在,不存在则查询数据库。
    • 第三方缓存库

      • MyBatis的二级缓存设计得比较灵活,你可以使用MyBatis默认实现的二级缓存;你也可以通过实现org.apache.ibatis.cache.Cache接口自定义缓存;也可以使用第三方内存缓存库,如MemCached、OSCache、EHCache等

  • 相关阅读:
    解决apt update执行时因签名而运行失败的问题
    easiLinux: 一种基于python的linux功能命令简易化脚本
    16 | 把大象装进冰箱:HTTP传输大文件的方法
    6. 【图的遍历】⼴度优先遍历(BFS)、⼴度优先⽣成树(森林) + 深度优先遍历(DFS)、深度优先⽣成树(森林)
    90%的面试官都会问到交换网络里面冗余和破环的STP协议
    nn.Sequential与tensorflow的Sequential对比
    Android Studio快速实现Flutter应用的国际化和多语言支持
    【Proteus仿真】【STM32单片机】汽车车窗除霜系统设计
    【调试经验】MySQL - fatal error: mysql/mysql.h: 没有那个文件或目录
    基于JavaEE和SSH框架的网络阅卷任务分发系统
  • 原文地址:https://blog.csdn.net/qq_52248567/article/details/126407323