欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot
一级缓存
一级缓存:SqlSession级别的缓存,基于PerpetualCache的HashMap本地缓存,其存储作用域为同一个SqlSession
public class Start2 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//true表示自动提交。否则需要使用commit方法才会提交。默认是false
SqlSession session = sqlSessionFactory.openSession();
//拿到接口的代理对象
Dao dao=session.getMapper(Dao.class);
//拿到了dao这个对象接下来就可以创建sql语句了(直接调用接口方法)
List list1 = dao.selAll();
//再做一次重复查询(由于设置了一级缓存,查询速度很快)
List list2 = dao.selAll();
session.commit();
}
}
一级缓存是默认开启的,当创建SqlSession对象时候就开启了。
一级缓存通过简单Map集合来实现,并没有对Map集合的大小,容量进行限制
一级缓存是一个粗粒度的缓存,没有办法去精确控制缓存中的数据是否过期以及去更新缓存数据
一级缓存中数据的有效期
默认是开启的,如果不想用缓存,直接在select节点中增加 useCache="false" 和 flushCache="true" 属性即可。
flushCache:将其设置为true,无论语句什么时候被调用,都会导致缓存被清空,避免数据库脏读。
<select id="articles" parameterType="int" resultMap="result" useCache="false" flushCache="true">
select user.name from user where user.id = #{id}
</select>
SqlSession对象调用clearCache()方法的时候,会自动清除缓存中的数据。SqlSession对象还是可以正常使用。
SqlSession对象关闭的时候,SqlSession对象就不能再使用了,缓存会失效。
mybatis整合spring,一级缓存会失效,因为mybatis会在每次查询之后自动关闭sqlSession。
当在两次相同的查询中间穿插了 新增 修改 删除 操作,也会清除缓存中的数据。
二级缓存(避免使用)
mybatis的二级缓存是基于application为生命周期
默认采用基于PerpetualCache的HashMap存储,其存储作用域为Mapper(Namespace)。
当某一个作用域(二级缓存Namespaces)进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。
MyBatis 默认没有开启二级缓存,开启只需在 mybatis-config.xml 配置文件中写入如下代码:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
mapper.xml中:
<!-- 回收策略为先进先出 -->
<!-- 自动刷新时间60s -->
<!-- 最多缓存512个引用对象 -->
<!-- 只读 -->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
useCache=false:禁用二级缓存。
避免使用原因:
多个Mapper(Namespace)可能对同一个表有相同的操作,会发送错误(两个命名空间下的数据不一致)