缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力。跟Hibernate 一样,MyBatis 也有一级缓存和二级缓存,并且预留了集成第三方缓存的接口。
缓存的体系结构
MyBatis 跟缓存相关的类都在cache 包里面,其中有一个Cache 接口,只有一个默认的实现类 PerpetualCache,它是用HashMap 实现的。我们可以通过 以下类找到这个缓存的庐山真面目
DefaultSqlSession
-> BaseExecutor
-> PerpetualCache localCache
->private Map<Object, Object> cache = new HashMap();
除此之外,还有很多的装饰器,通过这些装饰器可以额外实现很多的功能:回收策略、日志记录、定时刷新等等。但是无论怎么装饰,经过多少层装饰,最后使用的还是基本的实现类(默认PerpetualCache)。可以通过 CachingExecutor 类 Debug 去查看。
Mybatis中的一级缓存是默认开启的,只在一个会话中有效,
如果要使用mybatis中的二级缓存,在mybatis中是默认开启的,我们需要在配置文件中显式的配置出来,在mapper.xml中使用<cache/>,
当我们使用了二级缓存后,查询的基本流程是先查询二级缓存,当二级缓存中没有的时候,查询一级缓存,当一级缓存也没有的时候,查询数据库