mybatis缓存

木易 1419 0 1

mybatis的缓存分为两种  一级缓存和二级缓存 

一级缓存是基于sqlSession级别的缓存 二级缓存是基于mapper级别的缓存

一级缓存默认开启  二级缓存默认关闭

当用户使用同一个sqlSession时查询到的数据可能是一级缓存的数据

不同的sqlSession使用同一个mapper时查询,查询到的数据可能是另一个sqlSession做相同操作留下的缓存

如果你配置了二级缓存,那么查询数据的顺序应该为:二级缓存→一级缓存→数据库

存放二级缓存数据的地方在Configration中

当一个sqlSession刷新或者关闭时,对应的缓存会被清空  使用select默认不会清空缓存  insert、update、delete默认会清空一级缓存



当一个用户通过sqlsession发送一条请求时,sqlsession会把sql语句交给executor,executor会先去本地缓存中查询是否有需要的数据,如果要是有会先从本地缓存中取出来,要是没有会跟数据库进行交互,

把查询出来的数据放到本地缓存,然后在返给用户


一级缓存的有效期

1当不是同一个sqlSession时  s1中的缓存 s2中不能用

2.当sqlSession调用.clearCache()方法的时候会自动清空缓存

3.当sqlSession对象关闭时

4. insert、update、delete默认会清空一级缓存

一级缓存实现的原理及性能分析

1.一级缓存通过简单的Map集合来实现,并没有对map集合的大小,容量进行限制

2.一级缓存是粗粒度缓存,没有办法去精确控制缓存中的数据是否存在过长,是否过期,以及更新缓存数据

3.多个sqlsession对象缓存中的数据无法共享



二级缓存  (一个xml文件对应一个二级缓存)

二级缓存需要手动配置


1.在总的配置文件中开启二级缓存 

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

    2.在想要开启二级缓存的xml文件中加入  <cache></cache>标签

    3.实体类实现serializable接口,进行序列化

    执行顺序  二级缓存→一级缓存→数据库

    eviction:缓存的回收策略

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

            FIFO - 先进先出,按对象进入缓存的顺序来移除它们

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

            WEAK - 弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象

            默认的是LRU 

    flushInterval:缓存刷新间隔

            缓存多长时间清空一次,默认不清空,设置一个毫秒值

    readOnly:是否只读

    true:只读:mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。

     mybatis为了加快获取数据,直接就会将数据在缓存中的引用交给用户 。不安全,速度快

    false:读写(默认):mybatis觉得获取的数据可能会被修改

    mybatis会利用序列化&反序列化的技术克隆一份新的数据给你。安全,速度相对慢

    size:缓存存放多少个元素

    type:指定自定义缓存的全类名(实现Cache接口即可)

    

在新的sqlSession中对象,使用二级缓存需要先将前面的sqlSession对象关闭,数据才会进入二级缓存

二级缓存使用.png


一级缓存运行图

一级缓存运行图.png


二级缓存运行原理图

二级缓存运行图.png



评论区
请写下您的评论...
暂无评论...
猜你喜欢
算法基础 1076 在生产环境中,会因为很多的原因造成访问请求绕过了,都需要访问数据库持久层,虽然对Redsi服务器不会造成影响,但是数据库的负载就会增大,使的作用降低。穿透穿透是指查询一个根本不
official 657 [TOC]一、pom文件?xmlversion="1.0"encoding="UTF-8"?projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
java序列化储存 2781 序列化和反序列化请参考:http://www.jiajiajia.club/blog/artical/yjw520/161源码下载地址:http://photo.jiajiajia.club/file/blob.rarcontroller层代码:importorg.springframework.beans.factory.annotation.Autowired;importorg.spring
git 488 参数:—hard—soft—mixed参数: 参数 功能 场景 –hard 清空工作区与区 放弃目标版本后所有的修改 –soft 保留工作区与区,但是把版本之间的差异放在
git 928 一、git可以简单分为三个区域工作区(workingdirectory)暂区(stageindex)历史记录区(history)二、三个区域关系  工作区是我们能看到的区域,我们在工作区修改增加代
框架 1016 mybatis遍历int数组foreachcollection="ids"index="index"item="item" open="("separator=","close=")" #{item}/foreach
spring/springmvc 1535 springmvc+mybatis整合shiro权限1.需要的jar包propertiesshiro.version1.3.2/shiro.version/propertiesdependency
weblog 843 mybatis模糊查询(mysql)接口方法:intcount(@Param("name")Stringname);配置文件: selectid="count"resultType="int
归档
2018-12  5 2019-01  2 2019-04  1 2019-05  2 2019-06  1 2019-11  1 2019-12  3
标签
博客 java linux springboot 笔记 问题 cloud
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。