Mybatis的缓存机制

为了加快程序的执行效率,mybatis提供了两种缓存。

一级缓存(默认开启)

一级缓存默认是sqlSession级别的,同一个sqlSession执行的查询语句会被放入一级缓存中进行保存,下次执行相同语句前会直接从缓存中获取结果。
一级缓存失效的条件

  1. 不同的sqlSession
  2. 不同的sql语句(这个显而易见)
  3. 中途执行了增删改操作
  4. 手动刷新了缓存

一级缓存的内部原理
Mybatis内部存储缓存使用的是一个HashMap对象,key为 hashCode + sqlId + sql 语句。而value值就是从查询出来映射生成的java对象。而为了保证缓存里面的数据肯定是准确数据避免脏读,每次我们进行数据修改后(增、删、改操作)就会执行commit操作,清空缓存区域。

一级缓存存在的问题
不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。所以在这种情况下,是不能实现跨表的session共享的。由于不同的sqlSession之间的缓存数据区域不共享,如果使用多个SqlSession对数据库进行操作时,就会出现脏数据。
举个例子:比如sqlSessionA 对表A进行了查询操作,而sqlSessionB对表A执行了增删改操作,但是此时A的缓存区并没有进行刷新,所以A再次进行查询就直接从缓存中取得数据,因此取得的是脏数据。
解决方案
在这里插入图片描述
在mybatis核心配置文件中将该属性设置为statement级别

二级缓存(需手动开启)

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是可以横跨跨SqlSession的。二级缓存区域是根据mapper的namespace划分的,相同namespace的mapper查询数据放在同一个区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分,也就是根据命名空间来划分的,如果两个mapper文件的命名空间一样,那样,不同的SqlSession之间就可以共享一个mapper缓存。
二级缓存的开启方式
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值