Mybatis 一级缓存、二级缓存

作者 : Stanley 罗昊

转载请注明出处和署名,谢谢!

查询缓存

首先,我们先看一下这个标题“查询缓存”,那就说明跟增、删、改是没有任何关联的只有在查询时,才会遇到缓存,增删改不涉及!

查询缓存目前Mybatis中提供了两个,分别是:一级缓存、二级缓存;

一级缓存

先说一下一级缓存的范围:同一个SqlSession对象,也就说,我们是同一个SqlSession对象,又要进行同样的查询操作,那么,我们就可以去缓存中获取;

所以,SqlSession的缓存,是属于一级缓存;

那,又有什么用呢?

比如,我们现在数据库中有两条数据,分别是张三跟李四;

我现在呢,要根据name来查询张三这个人,首先说明一点,这是第一次去根据name来查询张三,这个时候呢,我们就会去访问数据库,去获取name是张三的数据,拿到张三后,它会把张三又放进了Sqlssion对象中去了,Sqlssion对象存在内存中;

也就是说,我们第一次查完后,我们会将张三这个数据从数据库中获取一下,获取后放到缓存里面,此时的缓存就在内存里面,具体的来说,它就在Sqlsession对象里面;

上述操作如下图:

如果,再有一次或再有N次来查询这个张三,我就不需要去访问数据库了,因为我在缓存里面已经有了,如果你再要拿这个张三,直接直接从缓存里面去拿;

因此呢,我们可以发现,缓存可以减少数据库的访问

我们都知道,数据库的打开与关闭均比较费性能,所以,我们就不需要从数据库中拿了,直接从缓存中去获取就完事了,意思就是可以提高性能;

SqlSession对象清空机制

只要执行你commit(提交)这个方法,那么就会直接将SqlSession对象全部清空掉,一旦执行commit,就会清理我们的缓存对象;

上述如下图:

首先,这些操作,我们不需要去手动的去编写,我们仅需知道并了解即可,因为Mybatis默认了就开启了一级缓存;

总结:

如果用相同的SqlSession对象查询相同的数据,则只会在第一次查询时发送Sql语句,并将这个查询的结果放入到Sqlsession中(作为缓存存在);

后续再次查询该同意的对象时,则直接从缓存中查询该对象即可(即省略了数据库的访问)

二级缓存

首先,这个Mybatis自带二级缓存;

也有三方提供的二级缓存;

Mybatis觉得缓存很重要,所以就自带了一个缓存,但是,Mybatis必定不是搞缓存的,搞数据的,但是第三方公司给你提供了一些缓存,因为你mybatis做缓存这块儿不是专业的;

我们可以回顾一下,一级缓存是同一个Sqlsession对象,那么二级缓存呢?

二级缓存是同一个在同一个namespace生成的mapper对象,重点是这个namespace; 

也就是说,哪怕你生成了许多对象,只要你这个对象来自同一个namespace,它们就会共享同一个缓存;

什么是namespace,我在这里就不强调了,因为这个是mybatis入门必学的;

简单点来说:

只要产生的xxxMapper对象来自于同一个namespace,则,这个对象共享二级缓存;

二级缓存的这个共享范围,是同一个namespace产生的xxxMapper对象;

开启缓存很简单,如果你是boot项目的话,直接在你需要开启的mapper.xml中加上一句话,来表示本namespace开启了二级缓存:

<cache/>;

如果是ssm框架的话,需要在conf.xml中添加一些配置:

在这里,顺便提一下,mybatis的二级缓存是属于序列化,序列化的意思就是从内存中的数据传到硬盘中,这个过程就是序列化;

反序列化意思就是相反而已;

也就是说,mybatis的二级缓存,实际上就是将数据放进了硬盘文件中去了;

实现序列化接口

如果你要使用mybatis的二级缓存,那么你除了要在你需要缓存的mappe.xml中开启以外,你还需要实现序列化的接口,在你需要使用二级缓存的实体类中;

去实现这个 Serializable(序列化)接口即可;

现在呢,你仅仅的将Student类给序列化了,Student有父类、级联属性,它们是不会跟着被序列化的,所以光这些是不够的;

其实很简单,如果Student需要序列化,但是这个类中还有其他类的属性,仅需将其他类也序列化即可!

比如学生类中继承了父类,那么父类也需要实现Serializable这个接口进行序列化;

缓存时机

该序列化也序列化了,也已经在你需要进行缓存的mapper.xml文件中也开启缓存了,但是如果你使用原生的SqlsessionFacotry(SSM\SpringBoot除外因为是集成好的不需要写底层)去写的时候会发现,缓存并没有起效,而是关闭Session(session.close())才生效了;

这个其实就是mybatis的一个机制,其实很好理解;

比如,我现在去查询张三,获取张三数据之后我们需要经过序列化然后存贮到硬盘上,上面我也说过了,mybatis的二级缓存实际上就是将数据保存到硬盘上的某个文件中了,照这样,每来一个新的对象,比如张三存进来了,李四也需要存,王五也需要,如果是存储到硬盘上,那么就会用到IO技术,众所周知,IO也是比较费性能,所以这个机制就是当你关闭session的时候,我们把这些张三、李四、王五这些数据一块儿保存到硬盘上,而不是来一个保存一个这样IO也受不了,所以就存在这样的机制;

Mybatis一级缓存、二级缓存详讲的更多相关文章

  1. Mybatis一级、二级缓存

      Mybatis一级.二级缓存   一级缓存 首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示. <mapper namespace="c ...

  2. 170214、mybatis一级和二级缓存

    mybatis一级缓存是指在内存中开辟一块区域,用来保存用户对数据库的操作信息(sql)和数据库返回的数据,如果下一次用户再执行相同的请求, 那么直接从内存中读数数据而不是从数据库读取. 其中数据的生 ...

  3. MyBatis 一级、二级缓存

    一级 默认session就有一级缓存,session有C/U/D操作或者session.clearCache();session.commit();都会清空缓存: 二级在mapper.xml中添加&l ...

  4. MyBatis(七):MyBatis缓存详解(一级缓存/二级缓存)

    一级缓存 ​ MyBatis一级缓存上SqlSession缓存,即在统一SqlSession中,在不执行增删改操作提交事务的前提下,对同一条数据进行多次查询时,第一次查询从数据库中查询,完成后会存入缓 ...

  5. Mybatis自定义分布式二级缓存实现与遇到的一些问题解决方案!

    先说两句: 我们都知道Mybatis缓存分两类: 一级缓存(同一个Session会话内) & 二级缓存(基于HashMap实现的以 namespace为范围的缓存) 今天呢, 我们不谈一级缓存 ...

  6. Spring + MySQL + Mybatis + Redis【二级缓存】

    一.Redis环境 Redis 官网 :http://redis.io/ windows下载:https://github.com/dmajkic/redis/downloads 1.文件解压缩 2. ...

  7. 【MyBatis学习13】MyBatis中的二级缓存

    1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的.为了更加 ...

  8. mybatis整合redis二级缓存

    mybatis默认开启了二级缓存功能,在mybatis主配置文件中,将cacheEnabled设置成false,则会关闭二级缓存功能 <settings> <!--二级缓存默认开启, ...

  9. Hibernate 再接触 一级缓存 二级缓存 查询缓存

    缓存 就是把本来应该放在硬盘里的东西放在内存里  将来存内存里读 一级缓存: session缓存 二级缓存: sessionFactory级别的   (适合经常访问,数据量有限,改动不大) 很多的se ...

  10. Mybatis使用Redis二级缓存

    在Mybatis中允许开发者自定义自己的缓存,本文将使用Redis作为Mybatis的二级缓存.在Mybatis中定义二级缓存,需要如下配置: 1. MyBatis支持二级缓存的总开关:全局配置变量参 ...

随机推荐

  1. [译]Nginx入门引导教程

    本文为[Beginner's Guide]译文,原文地址:http://nginx.org/en/docs/beginners_guide.html Guide 本教程基础的介绍了 nginx,以及能 ...

  2. Error : Program type already present: android.support.design.widget.CoordinatorLayout$

    背景 因为公司一个app项目需要扩展,因为功能较多且较完整的流程与业务,而且和以前的业务关系不大,所以我整合到了 另外一个分包中(代号:newFunc,请注意是代号)进行依赖. 当我写完这部分业务开始 ...

  3. Net Framework 4个Timer(网络收集整理)

    在 Visual Studio .NET 和 .NET Framework 中有四种计时器控件: (前边三种转载自 http://blog.csdn.net/aptentity/article/det ...

  4. 100天搞定机器学习|Day57 Adaboost知识手册(理论篇)

    Boosting算法 Boosting是一种用来提高弱分类器准确度的算法,是将"弱学习算法"提升为"强学习算法"的过程,主要思想是"三个臭皮匠顶个诸葛 ...

  5. Java项目多版本部署及快速回滚(含完整命令)

    1. 场景描述 java项目linux环境下快速部署,以前介绍过,今天主要结合linux的软连接,实现版本的快速切换(回滚),包含完整的start.sh与stop.sh,只需修改包名和路径即可运行,有 ...

  6. 小程序如何判断用户(后台使用Django)

    小程序如何判断用户是哪个: 有Web开发经验的都知道,客户端用户发起请求,服务器收到请求后,可以通过把用户user_id记录到session里,然后下次通过session里面的user_id来辨别是哪 ...

  7. vsftp安装和配置

    2013-10-10 10:49:48|  分类: Linux|举报|字号 订阅     源码下载地址:ftp://vsftpd.beasts.org/users/cevans/untar/   1. ...

  8. 2019-2020-9 20199317 《Linux内核原理与分析》第九周作业

    第8章  进程的切换和系统的一般执行过程 1  进程调度的时机 1.1  硬终端与软中断 进程调度的时机都与中断相关,中断有很多种,都是程序执行过程中的强制性转移,转移到操作系统内核相应的处理程序.中 ...

  9. Flask 蓝图机制及应用

    我们都知道 flask 是一个轻量级的 web 框架,相对于其他同类型框架更为灵活.轻便.安全且容易上手.开发者可以随意编写自己想要的项目结构,同时还有很多的第三方库供君选择.但是灵活的同时也带来了相 ...

  10. 使用Python编写打字训练小程序

    你眼中的程序猿 别人眼中的程序猿,是什么样子?打字如飞,各种炫酷的页面切换,一个个好似黑客般的网站破解.可现实呢? 二指禅的敲键盘,写一行代码,查半天百度-那么如何能让我们从外表上变得更像一个程序猿呢 ...