提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

1、MyBatis中的一级缓存和二级缓存的区别

MyBatis的缓存分为一级和二级,它们的区别还是挺大的。我主要从作用范围、共享性、还有实现原理这几个方面来说。

  1. 实现流程
    一级缓存是基于BaseExecutor去查询一个PerpetualCache中的HashMap的到的缓存结果。而二级缓存时基于CachIngExecutor去查询去查询一个PerpetualCache中的HashMap的到的缓存结果。虽然都是PerpetualCache,但是不是同一个对象。
  2. 查询Cache的级别
    一级缓存只查询PerpetualCache,不涉及其他的Cache实例;二级缓存会通过多个Cache,最后才回到PerpetualCache中查询数据。
    • SynchronizedCache:加锁,确保线程安全
    • SerializedCache:对数据做序列化和反序列化的操作
    • LoggingCache:记录缓存命中率的日志。
    • LruCache:基于Lru删除最近最少使用的缓存对象,Lru策略就是基于LinkedHashMap实现的,最大长度默认为1024。
  3. 作用域
    一级缓存的作用域是SqlSession级别,每个线程一个;二级缓存的所用域是SqlSesionFactory级别,每个SqlSesionFactory一个,一般一个服务也只有一个。
  4. 优先级
    二级缓存优先级高于一级缓存,因为一级缓存的作用域原因,缓存命中率约等于0,主要是因为我们很少在一次事务中多次查询同一个数据,而二级缓存时全局共享,所以缓存命中率更高,不如直接查询二级缓存。
  5. 默认状态
    一级缓存默认开启,二级缓存默认关闭,需要在配置文件中手动开启。
  6. 缓存清理
    在执行增删改一级缓存会清空,二级缓存会清空对应Mapper的缓存。

更多推荐