MyBatis的一级缓存和二级缓存是怎么样的?

目录

1. 一级缓存

2. 一级缓存失效的几种情况

3. 二级缓存

4.二级缓存失效的情况

5. 二级缓存的相关配置

6. 缓存的查询顺序


MyBatis 的缓存共分为一级缓存和二级缓存。

1. 一级缓存

一级缓存是 SqlSession 级别的,通过同一个 SqlSession 查询到的数据会被缓存,下次查询相同的数据时,会直接从缓存中查询,不会从数据库重复访问。

2. 一级缓存失效的几种情况

(1)不同的 SqlSession 对应不同的缓存;

(2)同一个 SqlSession 查询条件不同;

(3)同一个 SqlSession 两次查询期间执行了任何一次增删改操作;

(4)同一个 SqlSession 两次查询期间手动清空了缓存;

3. 二级缓存

二级缓存是 SqlSessionFactory 级别的通过同一个 SqlSessionFactory 创建的 SqlSession 查询的结果会被缓存起来,此后若再执行相同的查询语句,结果就会从缓存中获取。

一个工厂可以创建多个 SqlSession,因此它所创建的 SqlSession 查询到的数据都被会缓存到二级缓存中。

二级缓存是需要手动开启的,需要以下几个条件

(1)在核心配置文件中,设置全局属性 cacheEnabled = "true",默认为 true,其实也不需要设置;

(2)在映射文件中设置标签<cache/>;

(3)二级缓存必须要SqlSession 关闭或提交之后有效;

(4)查询的数据所转换的实体类类型必须实现序列化的接口;

4.二级缓存失效的情况

二级缓存失效的情况只有一种,就是当两次查询执行了任意增删改在操作之后,会是一级缓存和二级缓存同时失效。

5. 二级缓存的相关配置

刚才我提到了,想要开启二级缓存,需要在 mapper.xml 的映射文件中配置上 <cache/> 这么一个标签,除此之外,我们还可以为此标签配置多个属性,常用的属性有以下几种。

enviction属性:缓存回收策略

LRU(Least Recently Used):最近最少使用的,移除最长时间不被使用的对象;

FIFO(First in First out):先进先出,按对象进入缓存的顺序来移除它们;

SOFT:软引用,移除基于垃圾回收器状态和软引用使用规则的对象;

WEAK:弱引用,更积极地基于垃圾回收器状态和弱引用规则的对象;

默认是LRU。

flushInterval属性:刷新间隔,单位毫秒

默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

size属性:引用数目,正整数。

代表缓存最多可以存储多少个对象,太大容易导致内存溢出。

readOnly属性:只读,ture或false

ture:只读缓存,会给所有调用者返回缓存对象的相同实例。因为这些对象不能被修改,者提供了很重要的性能优势。

false:读写缓存,会返回缓存对象的拷贝(通过序列化),这会慢一些,但是安全。

默认也就是false。

6. 缓存的查询顺序

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。

如果二级缓存没有命中,再去查询一级缓存。

如果一级缓存也没有命中,则查询数据库。

SqlSession 关闭之后,一级缓存中的数据会写入到二级缓存中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值