MyBatis的一级缓存和二级缓存的区别

什么是缓存
将数据存放在程序内存中,用于减轻数据库查询的压力,提升读取数据的速度,提高性能。

一级缓存

■ 两个级别
SqlSession级别的缓存,实现在同一个会话中数据的共享

    Statement级别的缓存,可以理解为缓存只对当前执行的这一个Statement有效,执行完后就会清空缓存

■ 一级缓存的生命周期和SqlSession一致

■ 设置为SqlSession级别的缓存,当执行insert/update/delete操作或close之后,缓存清空;
mysql 拿到一个查询语句后先看缓存,如果之前执行过该sql语句,则会将该sql语句和查询结果以key-value的形式被直接缓存在内存中,sql语句为key,查询结果为value,如果能命中该key,则直接返回缓存中的结果。如果没有命中,则会执行后面的分析语句过程,真正的执行该sql语句,查询完成后执行结果会被放入缓存中。

但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。

查询缓存失效非常频繁,当执行insert/update/delete操作或close之后,缓存都会被清空,对于更新压力大的数据库,缓存使用效率非常低,

除非是静态表(配置表)或者查询多的表适合使用查询缓存。

好在 MySQL 也提供了这种“按需使用”的方式。你可以将参数 query_cache_type 设置成DEMAND,这样对于默认的 SQL 语句都不使用查询

缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样:

 select SQL_CACHE * from T where ID=10;
`
**注意:**
MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。
一级缓存失效的四种情况:

      1.sqlSession不同。

      2.sqlSession相同,查询条件不同。因为缓存条件不同,缓存中还没有数据。

      3.sqlSession相同,在两次相同查询条件中间执行过增删改操作。(因为中间的增删改可能对缓存中数据进行修改,所以不能用)

      4.sqlSession相同,手动清空了一级缓存。
**二级缓存**
二级缓存

■ SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量;

■ 存储作用域为Mapper的namespace级别,可手动开启关闭,要在具体的mapper.xml中开启二级缓存。在核心配置文件 中加入:

<setting name="cacheEnabled"value="true"/>

<!-- 全局配置参数,需要时再设置 -->

    <settings>

       <!-- 开启二级缓存  默认值为true -->

    <setting name="cacheEnabled" value="true"/>

    </settings>

■ 可自定义存储源,如 EHCache(分布式缓存框架);

■ 当开启缓存后,数据的查询执行的流程就是二级缓存-> 一级缓存 -> 数据库;

■ 不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率;

■ MyBatis的二级缓存不适应用于映射文件中存在多表查询的情况,如果多个映射文件对应的Sql操作都使用的是同一块缓存,那么缓存的粒度就变粗了,多个Mapper  namespace下的所有操作都会对缓存使用造成影响。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值