Mybatis-缓存

 

目录

1、一级缓存

2、二级缓存

(1)使用步骤:

(2)缓存相关属性

3、缓存的查询顺序

4、缓存有关的设置

5、整合第三方缓存

 


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

Mybatis缓存机制:Map ->可以保存查询出的一些数据。


一级缓存:线程级别的缓存,本地缓存,sqlSession级别的缓存

二级缓存:全局范围的缓存;除过当前前程,当前sqlSession能用外,其他也可以使用。nameSpace级别的缓存


1、一级缓存

sqlSession级别的缓存,默认存在的

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

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

  1.  不同的sqlSession使用不同的以及缓存,只有在当前的同一个sqlSession期间查询到的数据会保存到这个sqlSession的缓存中,下一次使用这个sqlSession查询就会从缓存中拿。
  2. 一级缓存中没有缓存过这个数据。同一个方法,不同参数,可能因为之前没查过,所以还会发新的sql。
  3. 只要在同一个sqlSession期间,执行任何一个增删改操作,都会把一级缓存清空(不管是否和缓存的数据有关)
  4. 调用当前sqlSession的clearCache方法,手动清除了缓存。
  • 每次查询,先看一级缓存中有没有,如果没有就重新发送sql查询。
  • 每一个sqlSession拥有自己的一级缓存

(3)一级缓存不能被关闭,但可以使用clearCache方法清空本地本地缓存,或者使用配置来改变缓存的作用域


2、二级缓存

二级缓存:(second level cache)全局作用域缓存

  • 二级缓存默认不开启,需要手动配置
  • Mybatis提供了二级缓存的接口以及实现,缓存实现要求POJO实现Serializable接口
  • 二级缓存在sqlSession关闭者提交后才会生效

(1)使用步骤:

  1. 全局配置文件中开启二级缓存
        <settings>
            <!--开启二级缓存-->
            <setting name="cacheEnabled" value="true"/>
        </settings>
  2. 配置要使用二级缓存的Mapper.xml文件中,开启二级缓存

  3. POJO实现Serializable序列化接口

(2)缓存相关属性

eviction:缓存的回收策略

LRU:最近最少使用的,移除最长时间不被使用的对象

FIFO:先进先出,按对象进入缓存的顺利来移除他们

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

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

默认的是LRU

flushInterval:刷新间隔,单位毫秒

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

size:引用数目,正整数

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

默认值是 1024

readOnly:只读,true/false

true:只读缓存。给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势,但是会有一些安全问题。

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

因此默认是false


3、缓存的查询顺序

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

当一级缓存关闭了二级缓存就有数据了。

当二级缓存中没有此数据,就会看一级缓存,一级缓存也没有,就回去查数据库,查询后的结果放在一级缓存中。

任何时候都是先看二级缓存,再看一级缓存!如果大家都没有,再去查询数据库。查询完,将返回的数据添加到一级缓存中,一级缓存关闭或者sqlSession提交后,将数据放入二级缓存。


4、缓存有关的设置

(1)全局setting的cacheEnable:

配置二级缓存的开关。一级缓存一直是开着的。

(2)select标签的useCache:

配置这个select是否使用二级缓存,一级缓存一直是使用的。

(3)sql标签的flushCache属性:

增删改默认flushCache=true,sql执行后会同时清除一级缓存和二级缓存。

查询默认flushCache=false

(4)sqlSession的clearCache()方法

只是用来清除一级缓存的


5、整合第三方缓存

实现Cache接口即可

mapper.xml中设置<cache type="外部缓存的实现cache的类"

还可以使用<cache-ref namespeace="">指定当前Mapper和其他的Mapper共用一个缓存

猜你喜欢

转载自blog.csdn.net/weixin_44134725/article/details/113094451
今日推荐