Mybatis的两级缓存简述

Mybatis的两级缓存简述

  • 一级缓存
    • 一级缓存分析
    • 清空缓存的方式
  • 二级缓存
    • 二级缓存原理图
    • 开启二级缓存步骤
    • 二级缓存的禁用
    • 缓存的属性配置

一级缓存

一级缓存默认自动开启,存在内存中(本地缓存)不能被关闭,可以调用clearCache()来清空本地缓存,或者改变缓存的作用域,是SqlSession级别的缓存

一级缓存分析

Mybatis的两级缓存简述_第1张图片
工作原理分析
当用户发起第一次查询team=1001的时候,先去缓存中查找是否有team=1001的对象;如果没有,继续向数据中发送查询语句,查询成功之后会将teamId=1001的结果存入缓存中;

当用户发起第2次查询team=1001的时候,先去缓存中查找是否有team=1001的对象,因为第一次查询成功之后已经存储到缓存中,此时可以直接从缓存中获取到该数据,意味着不需要再去向数据库发送查询语句。

如果SqlSession执行了commit(有增删改的操作),此时该SqlSession对应的缓存区域被整个清空,目的避免脏读。
前提:SqlSession未关闭。

清空缓存的方式

  • 1、 session.clearCache( ) ;
  • 2、 execute update(增删改) ;
  • 3、 session.close( );
  • 4、 xml配置 flushCache=“true” ;
  • 5、 rollback;
  • 6、 commit。

二级缓存

Mybatis默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存。
二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace。
不同的sqlSession两次执行相同namespace下的sql语句参数相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。

二级缓存原理图

Mybatis的两级缓存简述_第2张图片

开启二级缓存步骤

1、在Mybatis框架的全局配置文件中开启二级缓存
Mybatis的两级缓存简述_第3张图片


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

2、在需要二级缓存的Mapper中添加缓存标志
Mybatis的两级缓存简述_第4张图片
3、实体类必须实现Serializable接口
Mybatis的两级缓存简述_第5张图片

二级缓存的禁用

对于变化比较频繁的SQL,可以禁用二级缓存。
在开始了二级缓存的XML中对应的statement中设置useCache=false禁用当前Select语句的二级缓存,意味着该SQL语句每次只需都去查询数据库,不会查询缓存。
useCache默认值是true。对于一些很重要的数据尽不放在二级缓存中。

缓存的属性配置

<cache>
    <property name="eviction" value="LRU"/>
    <property name="flushInterval" value="60000"/>
    <property name="size" value="1024"/>
    <property name="readOnly" value="true"/>
cache>

如果想在命名空间中共享相同的缓存配置和实例,可以使用cache-ref 元素来引用另外一个缓存。

<cache-ref namespace="com.kkb.mapper.TeamMapper" />
//引用TeamMapper命名空间中的cache。

你可能感兴趣的:(mybatis,缓存,java,开发语言)