Mybatis一级缓存

MyBatis缓存

  • 二级缓存的生命周期与程序是一个级别的,除非程序挂掉,不然,二级缓存一只都在。
  • 一级缓存与会话绑定。
    Mybatis一级缓存

一级缓存命中场景

  • 默认情况下,一级缓存时直接打开的

Mybatis一级缓存

一级缓存源码解析

  • 执行器执行的时候,查看缓存,如果缓存中没有,就去数据库中找,并且设置缓存
  • BaseExecutor中出现update(),rollback(),falushCache(),commit(),LocalCacheScope()时,就会调用clearLocalCache()方法来清空缓存。

Mybatis一级缓存

问题

  • spring集成mybatis,为什么会造成一级缓存失效?
  1. mybatis会把sqlSession关闭了,所以每次查询都会创建新的sqlSession,所以一级缓存根本不生效
  2. 又一个私有的内部类实现了InvocationHandlerSqlSessionTemplateDefaultSqlSession的增强类,里面不直接调用CURD方法,而是通过一个代理对象,增强了所调用的方法,并且做了扩展。

Mybatis一级缓存

  • 会话之外更新数据怎么办?

Mybatis一级缓存

Mybatis一级缓存