面试题之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等

MyBatis 缓存是一个常见的面试题。下面是一些常见的 MyBatis 缓存面试问题和答案: 1. 什么是 MyBatis 缓存MyBatis 缓存是一个用于提高系统性能的机制,它可以在查询数据库缓存结果,并在后续的相同查询中直接返回缓存的结果,减少数据库访问次数。 2. MyBatis 缓存有哪些类型? MyBatis 缓存有两种类型:一级缓存(本地缓存)和二级缓存(全局缓存)。 3. 什么是一级缓存?如何开启和关闭一级缓存? 一级缓存MyBatis 默认开启的,它是在 SqlSession 的生命周期内有效的,可以通过配置文件或编程方式关闭一级缓存。 4. 什么是二级缓存?如何开启和关闭二级缓存? 二级缓存是全局共享的缓存,可以被多个 SqlSession 共享。要开启二级缓存,需要在 MyBatis 配置文件中进行相应的配置。关闭二级缓存也是在配置文件中设置。 5. MyBatis 的二级缓存如何实现缓存更新和失效? MyBatis 的二级缓存使用了基于触发器的机制来实现缓存更新和失效。当数据发生变化时,会触发相应的更新操作,保证缓存数据的一致性。 6. MyBatis 缓存的实现原理是什么? MyBatis 缓存的实现原理是通过将查询结果缓存在内存中,使用一个 Map 结构来存储查询结果。当需要查询时,首先检查缓存是否存在对应的结果,如果存在则直接返回缓存结果,否则执行数据库查询操作,并将结果放入缓存。 这些问题涵盖了 MyBatis 缓存的基本概念和实现原理。希望对你有所帮助!如果你还有其他问题,请继续提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daylan Du

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值