一、一级缓存:算法
MyBatis默认开启了一级缓存,一级缓存是在sqlSession层面进行缓存的。 即同一个SqlSession屡次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,而后把数据缓存到缓冲中,之后直接从缓存中直接取出,不会直接查询数据库。
sql
可是不一样的SqlSession对象,由于不一样的SqlSession都是相互隔离的,因此相同的Mapper、参数和方法,它仍是会再次发送。数据库
二、二级缓存:缓存
为了克服一级缓存不一样SqlSession对象引起的问题,须要开启二级缓存。二级缓存是缓存的zaiSqlSessionFactory层m面给各个SqlSession对象共享。默认二级缓存是不开启的,须要手动开启。安全
2.1 、开启二级缓存的配置:app
在xx-mapper.xml文件中配置:性能
<!-- 开启二级缓存(默认参数) --> <cache/>
默认的参数属性:spa
自定义二级缓存参数:code
<!-- 开启二级缓存 -->
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
二级缓存的各个参数属性:xml
- LRU:最少使用原则,移除最长时间不用的对象
- FIFO:先进先出原则,按照对象进入缓存的顺序进行回收
- SOFT:软引用,移除基以垃圾回收器和软引用规则的对象
- WEAK:弱引用,更积极的移除基以垃圾回收器和软引用规则的对象
能够在Mapper的具备方法下设置对二级缓存的访问意愿:
若是一条语句每次都须要最新的数据,就意味着每次都须要从数据库查询数据,能够把这个属性设置为false,如:
<select id="selectAll" resultMap="BaseResultMap" useCache="false">
flushCache刷新缓存(就是清空缓存)
二级缓存默认会在insert、update、delete操做后刷新缓存,能够手动配置不更新缓存,以下:
<update id="updateById" parameterType="User" flushCache="false" />