当前位置: 首页 > article >正文

面试之mybatis的一二级缓存

1、mybatis的一级缓存

在同一次查询会话(SqlSession)中如果出现相同的语句及参数,就会从缓存中取出,不再走数据库查询。一级缓存只能作用于查询会话中,所以也叫做会话缓存。

2、一级缓存生效的条件

必须是相同的会话;

必须是同一个 mapper,即同一个 namespace;

必须是相同的 statement,即同一个 mapper 中的同一个方法;

必须是相同的 sql 和参数;

查询语句中间没有执行 session.clearCache() 方法;

查询语句中间没有执行 insert/update/delete 方法(无论变动记录是否与缓存数据有无关系)

3、一级缓存与spring结合失效的原因

因为一级缓存是会话级别的,要生效的话,必须要在同一个 SqlSession 中。但是与 springboot 集成的 mybatis,默认每次执行sql语句时,都会创建一个新的 SqlSession!所以一级缓存才没有生效。

4、如何解决一级缓存失效

只要将方法开启事务,那么一级缓存就会生效。

5、二级缓存

它脱离于会话之外,多个会话可以使用相同的缓存。二级缓存需要手动来开启,mybatis 默认没有开启二级缓存。

1)在 yaml 中配置 cache-enabled 为 true

2)Mapper 接口上添加 @CacheNamespace 注解

3)实体类实现 Serializable 接口

6、生效的条件

当会话提交或关闭之后才会填充二级缓存;

必须是同一个 mapper,即同一个命名空间;

必须是相同的 statement,即同一个 mapper 中的同一个方法;

必须是相同的 SQL 语句和参数;

如果 readWrite=true(默认就是true),实体对象必须实现 Serializable 接口

7、缓存清除条件

只有修改会话提交之后,才会执行清空操作;

xml 中配置的 update 不能清空 @CacheNamespace 中的缓存数据;

任何一种增删改操作都会清空整个 namespace 中的缓存;

8、为什么mybatis默认不开启二级缓存?

二级缓存虽然能带来一定的好处,但是有很大的隐藏危害!它的缓存是以 namespace(mapper) 为单位的,不同 namespace 下的操作互不影响。且 insert/update/delete 操作会清空所在 namespace 下的全部缓存。那么问题就出来了,假设现在有 ItemMapper 以及 XxxMapper,在 XxxMapper 中做了表关联查询,且做了二级缓存。此时在 ItemMapper 中将 item 信息给删了,由于不同 namespace 下的操作互不影响,XxxMapper 的二级缓存不会变,那之后再次通过 XxxMapper 查询的数据就不对了,非常危险。


http://www.kler.cn/news/359644.html

相关文章:

  • 基于深度学习的西红柿成熟度检测系统
  • CTF(二)
  • excel导出加密
  • IDEA下lombok安装及找不到get,set的问题的解决方法
  • 【Python-AI篇】数据结构和算法
  • Dockerfile 中 Expose 命令的作用
  • Spring 中的 @AUtowire 和 @Resource 用法和原理,以及避坑
  • 24.安卓逆向-frida基础-objection工具3-实战
  • RabbitMQ系列学习笔记(八)--发布订阅模式
  • linux线程 | 同步与互斥 | 线程池以及知识点补充
  • 轻帆云移动端智能语音提单:一键触达,智能工单新体验,助力高效运营
  • 分布式篇(分布式事务)(持续更新迭代)
  • 出栈序列的合法性判断
  • PyCharm借助MobaXterm跳板机连接服务器
  • laydate.laydate.render()开始日期和结束日期选择器互相限制选择值动态生效
  • 了解 ChatGPT 中的公平性问题
  • 基于MATLAB的混沌序列图像加密程序
  • 深入理解计算机系统--计算机系统漫游
  • 专题:数组(已完结)
  • 企业一级流程架构规划方法