Mybatis的一级缓存和二级缓存是什么?

首先来说缓存:
合理使用缓存是优化中最常见的方法之一,将从数据库中查询出来的数据放入缓存中,下次使用 时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能。

一级缓存

一级缓存默认开启,不需要配置。

一级缓存是 SqlSession 级别的缓存

先说什么是SqlSession:

SqlSession是Mabatis的核心接口,它扮演着应用程序与数据库之间交互操作的桥梁角色。可以将其理解为一个数据库 会话,类似于在使用JDBC时的Connection对象。SqlSession提供了执行SQL语句、获取Mapper接口实例、以及管理事务(包括开启事物、提交和回滚)的能力。
注意:长时间持有SqlSession可能导致资源泄露,应及时释放。
而一级缓存就是缓存SqlSession的查询结果,下次使用同样的SQL、同样的参数执行查询时,就可以直接从缓存中返回结果,而不必查询数据库。
一级缓存的生命周期很短,随着SqlSession的关闭而清除。
一级缓存的键就是sql + 参数,值则为查询结果,缓存形式是Map结构。
另外,如果命中缓存,由于不查询数据库,所以不会打印sql语句。

二级缓存

二级缓存是 mapper 级别的缓存
注意:二级缓存默认不开启,需要在mybatis-config.xml中显式的声明开启:
<!-- 通知 MyBatis 框架开启二级缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>

同时,需要在Mapper.xml文件中添加 <cache/>标签,表示对哪个mapper开启二级缓存。


二级缓存的作用域大于一级缓存,其作用域基于命名空间(namespace),它可以被多个SqlSession共享,生命周期较长,甚至在整个应用的生命周期内持续有效,除非被显式清理或超时。

简单来说,二级缓存就是缓存了很多个“一级缓存”,在开启二级缓存时,查出来的数据默认先存储在一级缓存中,当有 SqlSession关闭 时,它里面一级缓存中的数据就会被存储到Mapper的二级缓存中,这样该Mapper中的其他会话执行了相同方法时,就会在二级缓存中找到匹配的数据,如果没有找到,才会去数据库中查找。注意只有在该会话关闭时,它一级缓存中的数据才会被刷到二级缓存中。另外如果只是开启二级缓存的全局(config)开关,而会话(student)没有开启二级缓存,查询时也不会在二级缓存中查询。

二级缓存的键也是sql + 参数,值则为查询结果,缓存形式也是Map结构。

二级缓存要求返回的 POJO 必须是可序列化的,即要求实现 Serializable 接口。
当开启二级缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

一二级缓存的实现原理

对于一级缓存从,每个SqlSession持有一个叫Executor的对象,而Executor又会持有一个Local Cache(本地缓存),当缓存命中,直接返回Local Cache中的数据,否则查询数据库,再将数据写入Local Cache。

而二级缓存则是在原来的Executor上,通过“装饰器设计模式”,在一级缓存之上新增了一个装饰器CacheExecutor,来进行全局缓存,共享粒度则控制到了namespace,即A-namespace中的缓存不对B-namespace开放,相互独立。

 再说所有缓存对象的顶级接口:Cache

public interface Cache {
 
  /**
   * 缓存的唯一标识
   */
  String getId();
 
  /**
   * 设置缓存,key-value键值对方式
   */
  void putObject(Object key, Object value);
 
  /**
   * 根据key获取对应的缓存
   */
  Object getObject(Object key);
 
  /**
   * 根据key移除对应的缓存
   */
  Object removeObject(Object key);
 
  /**
   * 清空所有的缓存
   */
  void clear();
 
  /**
   * 缓存中元素总数
   */
  int getSize();
 
  /**
   * 读写锁
   */
  ReadWriteLock getReadWriteLock();
 
}

Cache定义了缓存的基本操作,可以通过实现Cache接口的方式自定义缓存类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值