1.一级缓存|二级缓存
- 一级缓存:
- 是指当使用SqlSession从数据库中取数据时,Executor会在优先查找本地缓存中的数据,如果命中缓存,则直接返回本地缓冲区中的数据,否则会从数据库中进行查找,查找结果缓存到本地的同时,发送给SqlSession。
- 当第二次查询SQL语句相同时,会直接从本地缓存中拿取数据。session级别的一级缓存是靠PerpetualCache(内部原理HashMap<K, V>)实现的。
- 二级缓存:
- 二级缓存利用设计模式中的装饰者模式得到一个CachingExecutor,CachingExecutor是Executor的实现类。其拿取数据流程和一级缓存类似。
- 不同的是二级缓存是应用级别的缓存,如果缓存数据较多的话,它可以将缓存内容存放至第三方数据库中,如MemCached、Redis等。
2.一级缓存性能分析
- MyBatis对会话(Session)级别的一级缓存设计的比较简单,就简单地使用了HashMap来维护,并没有对HashMap的容量和大小进行限制。
- 一级缓存是一个粗粒度的缓存,没有更新缓存和缓存过期的概念。
3.MyBatis缓存级别
- MyBatis一级缓存有两种级别:SESSION级别、STATEMENT级别
- MyBatis二级缓存级别是mapper级别的缓存,不同的mapper通常情况下有不同的namespace,也就都对应一个二级缓存。不同的mapper之间不会互相影响。需要注意的是,如果缓存的内容是查询数据库的结果,则当进行下一次增删改操作时,缓存会被刷新,从而保证数据的一致性。
4.一级缓存的使用
- 开启一级缓存
- SESSION级别:
<settings>
<setting name="localCacheScope" value="SESSION"/>
</settings>
- STATEMENT级别:
<settings>
<setting name="localCacheScope" value="STATEMENT"/>
</settings>
<select id="selectAll" resultMap="BaseResult" useCache="true">
select * from tb_user
</select>
<!--
useCache - 使用缓存
flushCache - 执行完是否清除缓存
-->
- 执行后打印的日志结果
5.二级缓存的使用
- 设置cacheEnabled,开启二级缓存
<settings>
<!--配置一级缓存(默认开启),共有两个选项,SESSION或者STATEMENT,默认是SESSION级别,
即在一个MyBatis会话中执行的所有语句,都会共享这一个缓存。一种是STATEMENT级别,
可以理解为缓存只对当前执行的这一个Statement有效。-->
<setting name="localCacheScope" value="SESSION"/>
<!-- 指定所用日志的具体实现,未指定时将自动查找 [STDOUT_LOGGING]-MyBatis日志 -->
<setting name="logImpl" value="LOG4J"/>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
- mapper中开启默认缓存,只需写上cache标签即可。
<mapper>
<!--配置默认缓存-->
<cache></cache>
</mapper>
- 查看结果