mybatis默认开启一级缓存。开启二级缓存也很简单,只需要将POJO实现 Serializable 接口,并在映射文件以及mybatis配置文件开启二级缓存即可。
1、一级缓存的作用域是SqlSession范围,当在同一个sqlSession两次调用同一个Mapper方法时,第一次执行完毕会将数据库中查询的结果写到缓存(内存,即sqlSession中的一个HashMap),如果SqlSession执行了增删改操作并且提交到数据库,MyBatis则会清空SqlSession中的一级缓存。
2、二级缓存是mapper级别的缓存,其作用域是mapper的同一个namespace(Dao接口)。不同的SqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存。
3、二级缓存默认使用LRU置换策略,要另外配置去mybatis配置文件配置eviction参数即可,具体其他策略:
- LRU最近最少使用策略,移除最长时间不被使用的对象。
- FIFO先进先出策略,按对象进入缓存的顺序来移除它们。
- SOFT软引用策略,移除基于垃圾回收器状态和软引用规则的对象。
- WEAK弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象。
参考:缓存实现源码分析