mybatis 03 一级缓存

  1. MyBatis的缓存
  2. 一级缓存的命中与失效
    1. 命中缓存的条件
    2. 触发缓存失效的行为
    3. 常见BUG
  3. Spring集成后一级缓存失效?

MyBatis的缓存

一级缓存,也叫会话级缓存,在BaseExecutor中实现,并且是默认启用

二级缓存,也叫应用级缓存,它是跨线程的,由CachingExecutor实现,需要开发者自行打开

一级缓存的命中与失效

命中缓存的条件

以下条件全部达成:

  • 同一个会话
  • Sql和参数必须相同
  • 必须是相同的statementId
  • 翻页查询参数RowBounds必须相同

触发缓存失效的行为

满足任意一种:

  • mapper上标记了flushCache=true,见1
  • 缓存的作用域为Statement,见2
  • 调用了update\commit\rollback\clearCache,见3

常见BUG

User user1 = mapper.selectById(3);
mapper.updateNameById(4, "zhangsan");
User user2 = mapper.selectById(3);
println(user1 == user2)
//输出为false!

Spring集成后一级缓存失效?

失效的原理是Spring 对SqlSession进行了封装,通过SqlSessionTemplae ,使得每次调用Sql都会重新构建一个SqlSession。SqlSessionInterceptor在这套体系中扮演了很重要的角色,它会判断2次请求是否在同一事物当中,如果是,就会用同一个SqlSession。要解决这个问题,给Spring 添加事物即可~


转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:mybatis 03 一级缓存

字数:280

本文作者:夏来风

发布时间:2020-06-05, 09:19:22

原始链接:http://www.demo1024.com/blog/mybatis-03-cachelv1/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。