MyBatis-4-MyBatis的缓存

目录

MyBatis缓存机制介绍

1:一级缓存

1.1:观察一级缓存

1.2:一级缓存失效方法;

- 1、不同的SqlSession对应不同的一级缓存

- 2、同一个SqlSession但是查询条件不同

- 3、同一个SqlSession两次查询期间执行了任何一次增删改操作(无论是修改谁的)

- 4、同一个SqlSession两次查询期间手动清空了缓存

1.3:一级缓存的源码原理

2:二级缓存:

1:二级缓存介绍,

2:二级缓存简单使用步骤

3:二级缓存的配置属性

4:一,二级缓存的查询顺序(先二级再一级,再查库)

3:缓存有关配置

4:mybatis整合第三方缓存

1:导包

2:写配置,编写ehcache.xml配置文件

3:配置cache标签

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


MyBatis缓存机制介绍

MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。缓存可以极大的提升查询效率;

缓存:暂时的存储一些数据;加快系统的查询速度...

数据库交互缓存的机制:

  Employee employee =  employDao.getEmpById(1);查出来的数据放进一级缓存中;也就是一个map;

MyBatis缓存机制:实质上就是一个Map;能保存查询出的一些数据;

一级缓存:线程级别的缓存;本地缓存;SqlSession级别的缓存;每一次跟数据库的链接都是一个sqlSession;

二级缓存:全局范围的缓存;除过当前线程;SqlSession能用外其他也可以使用;二级缓存需要手动开启和配置,他是基于namespace级别的缓存。

1:一级缓存

1.1:观察一级缓存

一级缓存:MyBatis:SqlSesion级别的缓存;默认存在;当  Session flush close , Session 中的所有 Cache 将被清空。

机制:只要之前查询过的数据,mybatis就会保存在一个缓存中(Map);下次获取直接从缓存中拿;

本地缓存不能被关闭, 但可以调用 clearCache() 来清空本地缓存, 或者改变缓存的作用域.

1.2:一级缓存失效方法;

- 1、不同的SqlSession对应不同的一级缓存

- 2、同一个SqlSession但是查询条件不同

- 3、同一个SqlSession两次查询期间执行了任何一次增删改操作(无论是修改谁的)

- 4、同一个SqlSession两次查询期间手动清空了缓存

1.3:一级缓存的源码原理

一级缓存利用org.apache.ibatis.cache.impl.PerpetualCache,存储在Map<Object, Object> cache = new HashMap();中

这是key:

这是value的初始值:

这是查询出来结果集后放进缓存中的value:

 

2:二级缓存:

1:二级缓存介绍,

二级缓存 (second level cache) ,全局作用域缓存,是namespace级别的;每一个dao.xml都得配置
二级缓存默认不开启,需要手动配置
MyBatis 提供二级缓存的接口以及实现,缓存实现要求 POJO 实现 Serializable 接口
二级缓存在 SqlSession 关闭或提交 之后才会 生效
 
 

2:二级缓存简单使用步骤

1 、全局配置文件中开启 二级 缓存
<setting name= " cacheEnabled " value="true"/>
2 、需要使用二级缓存的映射文件处使用 cache 配置缓存
<cache />
3 、注意: POJO 需要实现 Serializable 接口

 

结果:

3:二级缓存的配置属性

eviction=“ FIFO” 缓存回收策略:
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认的是 LRU
flushInterval 刷新间隔,单位毫秒
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时 刷新
s ize 引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易导致内存溢出
readOnly 只读, true/false
true :只读缓存 ;会 给所有调用者返回缓存对象的相同实例 因此这些对象不能被修改。这提供了很重要的性能 优势。
false :读写缓存; 会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false

 

4:一,二级缓存的查询顺序(先二级再一级,再查库)

1:不会出现一级缓存和二级缓存中有同一个数据

                   二级缓存什么时候有数据:一级缓存关闭二级缓存才有;

                   一级缓存什么时候有数据:二级缓存中没有此数据,就会看一级缓存,一级缓存没有就会去查库,查库结果放在一级                             缓存中

 

3:缓存有关配置

1 、全局 setting cacheEnable
配置 二级缓存的开关。一级缓存一直是打开的
2 select 标签的 useCache 属性:
配置 这个 select 是否使用二级缓存。一级缓存一直是使用 的,默认是true;
3 sql 标签的 flushCache 属性:
增删 改默认 flushCache =true sql 执行以后,会同时清空一级和 二级 缓存。
查询默认 flushCache =false
4 sqlSession. clearCache ()
只是 用来清除一级缓存

         5当在某一个作用域 (一级缓存Session/二级缓存Namespaces) 进行了 C/U/D 操作后,默认该作用域下所有 select 中的                   缓存将被clear

4:mybatis整合第三方缓存

1:导包

<!--整合第三方缓存,以ehcache为例-->
<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>
<!--ehcache依赖-->
<dependency>
   <groupId>net.sf.ehcache</groupId>
     <artifactId>ehcache</artifactId>
     <version>2.10.0</version>
</dependency>

其中包含

ehcache-core-2.6.8.jar

mybatis-ehcache-1.0.3.jar

slf4j-api-1.6.1.jar

slf4j-log4j12-1.6.2.jar

2:写配置,编写ehcache.xml配置文件

直接放在根目录下就行

 

3:配置cache标签

<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苍煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值