MyBatis缓存

介绍:
1、一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空
2、二级缓存与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同于存储作用域为Mapper(NameSpace) ,并且可自定义存储源,如Ehcache
3、对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。
mybatis的相关概念:
SqlSession:代表和数据库的一次会话,向用户提供了操作数据库的方法、
MappedStatement:代表要发往数据库执行的指令,可以理解为是Sql的抽象表示
Executor:具体用来和数据库交互的执行器,接受MappedStatement作为参数
映射接口:在接口中会要执行的Sql用一个方法来表示,具体的SQL写在映射文件中。
映射文件:可以理解为是Mybatis编写SQL的地方,通常来说每一张单表都会对应者一个映射文件,在该文件中会定义SQL语句入参和出参的形式

一级缓存:

  1. MyBatis的一级查询缓存(也叫本地缓存)是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是SqlSession
  2. 在同一个SqlSession中两次执行相同的sql查询语句,第一次执行完毕后,会将查询结果写入到缓存中,第二次会从缓存中直接获取数据,而不再到数据库中进行查询,这样就减少了数据库的访问,从而提高查询效率
  3. 当一个SqlSession结束后,改SqlSession中的一级查询缓存也就不存在了
  4. Mybatis默认一级查询缓存是开启状态,且不能关闭
  5. 增删改会清空缓存,无论是否commit当SqlSession关闭和提交时,会清空一级缓存
  6. spring整合mybatis后,非事务环境下,每次操作数据库都使用新的SqlSession对象,因此mybatis的一级缓存无法使用(一级缓存针对同一个SqlSession有效)
  7. 在开启事务的情况下。spring使用threadLocal获取当前资源绑定同一个SqlSession,因此此时一级缓存是有效的

一级缓存实现:
对SqlSession的操作mybatis内部都是通过Executor来执行的,Executor的生命周期和SqlSession是一致的,Mybatis在Executor中创建了一级缓存,基于PerpetualCache类的HashMap

二级缓存:
MyBatis的二级缓存是mapper范围级别的
SqlSession关闭后才会将数据写到二级缓存区域
增删改操作,无论是否进行提交commit(),均会清空一级、二级缓存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值