mybatis学习---缓存

目录

  • mybatis作用域
  • 一级缓存
  • 二级缓存

1.mybatis作用域

作用域作用范围
SqlSessionFactoryBuilder创建SqlSessionFactory对象,创建完成后自身销毁方法作用域
SqlSessionFactory应用中一直存在,用于创建SqlSession应用作用域
SqlSession每个线程都有一个自身的SqlSession,执行完成后关闭会话作用域
Mapper绑定映射的语句的接口同上相当

2. 一级缓存

2.1 简单示意图

示意图

2.2 生命周期

  1. 开启会话时由SqlSessionFactory创建一个新的SqlSession对象,该对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
  2. 如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;
  3. 如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;
  4. SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用;

3. 二级缓存

3.1 简单示意图

示意图

3.2 生命周期

  1. 映射语句中的所有的select语句都将会被缓存
  2. 映射语句文件中的所欲insert、update和delete语句会刷新缓存
  3. 缓存会使用默认的Least Recently Used(LRU,最近最少使用的)算法来收回

4. mybatis和spring结合后一级缓存失效

mybatis的一级缓存主要由SqlSession来进行控制,而spring对mybatis的SqlSession由template控制,sqlsession又被spring当作resource放在当前线程的上下文里(threadlocal),spring通过mybatis调用数据库的过程如下:

  1. 我们需要访问数据
  2. spring检测到之后,spring去资源池申请一个mybatis的SqlSession,并将申请到的sqlsession与当前线程绑定,放入threadlocal里面
  3. template从threadlocal获取到sqlsession,去执行查询
  4. 查询结束,清空threadlocal中与当前线程绑定的sqlsession,释放资源
  5. 我们又需要访问数据
  6. 返回到步骤

通过以上步骤后发现,同一线程里面两次查询同一数据所使用的sqlsession是不相同的,所以,给人的印象就是结合spring后,mybatis的一级缓存失效了。

参考资料:
https://blog.csdn.net/chenyao1994/article/details/79233725
https://www.cnblogs.com/happyflyingpig/p/7739749.html


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值