JAVA 面试 MyBatis
·
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
1、MyBatis中的一级缓存和二级缓存的区别
MyBatis的缓存分为一级和二级,它们的区别还是挺大的。我主要从作用范围、共享性、还有实现原理这几个方面来说。
- 实现流程
一级缓存是基于BaseExecutor去查询一个PerpetualCache中的HashMap的到的缓存结果。而二级缓存时基于CachIngExecutor去查询去查询一个PerpetualCache中的HashMap的到的缓存结果。虽然都是PerpetualCache,但是不是同一个对象。 - 查询Cache的级别
一级缓存只查询PerpetualCache,不涉及其他的Cache实例;二级缓存会通过多个Cache,最后才回到PerpetualCache中查询数据。- SynchronizedCache:加锁,确保线程安全
- SerializedCache:对数据做序列化和反序列化的操作
- LoggingCache:记录缓存命中率的日志。
- LruCache:基于Lru删除最近最少使用的缓存对象,Lru策略就是基于LinkedHashMap实现的,最大长度默认为1024。
- 作用域
一级缓存的作用域是SqlSession级别,每个线程一个;二级缓存的所用域是SqlSesionFactory级别,每个SqlSesionFactory一个,一般一个服务也只有一个。 - 优先级
二级缓存优先级高于一级缓存,因为一级缓存的作用域原因,缓存命中率约等于0,主要是因为我们很少在一次事务中多次查询同一个数据,而二级缓存时全局共享,所以缓存命中率更高,不如直接查询二级缓存。 - 默认状态
一级缓存默认开启,二级缓存默认关闭,需要在配置文件中手动开启。 - 缓存清理
在执行增删改一级缓存会清空,二级缓存会清空对应Mapper的缓存。
更多推荐


所有评论(0)