9.Mybatis一级缓存和二级缓存
所谓的缓存呢?其实原理很简单,就是在保证你查询的数据是正确的情况下,没有去查数据库,而是直接查找的内存,这样做有利于缓解数据库的压力,提高数据库的性能,Mybatis中有提供一级缓存和二级缓存。
学习一级缓存和二级缓存之前先来看一张缓存的原理图:

分析一个这个图:(从这个图中我们大概可以看出一下几点)
1.回顾一下SqlSession是操作数据库的会话。
2.一级缓存是对单个SqlSession而言的,无法跨SqlSession。
3.二级缓存是对namespace而言的,可以跨SqlSession。
4.二级缓存的范围比一级缓存大。
5.一级缓存是默认开启的,二级缓存要手动开启的。
使用缓存的时候大家应该会产生一个疑问,就是使用缓存的时候,读取数据会不会准确,是否会出现都脏数据的情况。
接下来我们先来看一下一级缓存:
一级缓存的原理图:

分析:
第一次发起查询请求的时候由于缓存没有数据,会去查询数据库。
第二次发起查询请求的时候缓存中有数据,就会从缓存中查询数据。
注意:查询缓存这里有两个前提:
第一个是:查询条件不变
第二个是:没有执行增加,插入,更新带有commit操作的,只要有执行关于commit操作的就会清空缓存
一级缓存是默认开启的,不需要设置
二级缓存原理图:

看这个图,大家就会知道,二级缓存和一级缓存的原理是类似的,唯一不同的是二级缓存需要配置,并且是跨SqlSession的。
分析一下一级缓存和二级缓存的区别:
一级缓存和二级缓存的区别:
二级缓存的范围比一级缓存大。
二级缓存可以多个sqlsession共享。
Commit的时候不管是一级缓存还是二级缓存都会清空
二级缓存的一个划分:
按照namespace来划分的 ,就是每一个namespace都要自己的一个二级缓存区域。
开启二级缓存:
1.全局配置文件中配置 (SqlMapConfig.xml)
<setting name="cacheEnabled" value="true" />//开启二级缓存
2.mapper中配置
<!-- 开启二级缓存 -->
<cache></cache>
测试二级缓存:(测试的原理其实和简单,既然二级缓存是跨SqlSession的,你就开启多个SqlSession,同样的查询条件,看看会不会走缓存就OK了)
@Test
public void cachetwo() throws IOException{
//mybatis的配置文件
String resource="mybatis-config.xml";
//得到配置文件流
InputStream inputStream= Resources.getResourceAsStream(resource);
//创建会话工厂,需要传入Mybatis的配置文件信息
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession session=sessionFactory.openSession();
SqlSession session2=sessionFactory.openSession();
SqlSession session3=sessionFactory.openSession();
//创建StudentMapper对象,mybatis自动生成代理对象
StudentMapper studentMapper=session.getMapper(StudentMapper.class);
List<Student>list=studentMapper.findAll();
session.close();
StudentMapper studentMapper2=session2.getMapper(StudentMapper.class);
List<Student>list1=studentMapper.findAll();
session2.close();
//资源释放
}
9.Mybatis一级缓存和二级缓存的更多相关文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- MyBatis 延迟加载,一级缓存,二级缓存设置
什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...
- mybatis高级(3)_延迟加载_深度延迟_一级缓存_二级缓存
设置延迟加载需要在mybatis.xml中设置 注: 侵入式延迟加载为真时是延迟加载 侵入式延迟加载为假时是深度延迟加载 <!-- 延迟加载和深度延迟加载 --> <settings ...
- 八 mybatis查询缓存(一级缓存,二级缓存)和ehcache整合
1 查询缓存 1.1 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存.
- myBatis学习(9):一级缓存和二级缓存
正如大多数持久层框架一样,MyBatis同样提供了一级缓存和二级缓存的支持 1. MyBatis一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为 Session,默认情 ...
- mybatis 详解(九)------ 一级缓存、二级缓存
上一章节,我们讲解了通过mybatis的懒加载来提高查询效率,那么除了懒加载,还有什么方法能提高查询效率呢?这就是我们本章讲的缓存. mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解 ...
- MyBatis从入门到放弃六:延迟加载、一级缓存、二级缓存
前言 使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMa ...
- Mybatis第八篇【一级缓存、二级缓存、与ehcache整合】
Mybatis缓存 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. myba ...
- MyBatis 一级缓存,二级缓存,延迟加载设置
1 什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再 ...
随机推荐
- 关于delegate(代理)总结
stackoverflow 上讲解:http://stackoverflow.com/a/12660523/4563358 delegate是将需要处理交给自己的代理. 在自己的对应的类中.h文件中 ...
- CentOS 6.5下静默安装oracle
本例: 通过SSH远程连接云主机,上传oracle11g安装包,在centos6.5上无图形化界面静默安装oracle11g. 涉及工具及环境: 1.本地环境windows7+ssh远程连接工具xSh ...
- asp.net 手工调用 WS(Get)方法:
asp.net 手工调用 WS(Get)方法: 通过手工HttpWebRequest,HttpWebResponse来模拟调用.核心代码:string strurl="http://loca ...
- java 配置文件读取
1.getResourceAsStream Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path ...
- 仿QQ消息气泡提醒
https://github.com/dkmeteor/Bubble-Notification 感谢这位作者,本例子只是封装了一下源码. 这是jar下载地址 下载之后只要引用就好.下面是一个最简单 ...
- nodejs——qureystring的作用
当node服务器向另一个服务器发送数据时,首先要转换成字符串再post或者get,这个时候就要用到node内置的这个包querystring, querystring.stringify(data);
- 【ORM】--FluentNHibernate之AutoMapping详解
上篇文章详细讨论了FluentNHibernate的基本映射的使用方法,它的映射基本用法是跟NHibernate完全一样的,首先要创建数据库链接配置文件,然后编写Table的Mappin ...
- PIC32MZ tutorial -- Core Timer
Core Timer is a very popular feature of PIC32 since it is a piece of the MIPS M4K core itself and is ...
- 数据库的NULL值讨论
有许多关于数据库设计中NULL的讨论,我个人的设计习惯是,不使用NULL值. 我所设计所有表都是Not Null的字段的,尤其是我主要做数据仓库的表设计.刚开始使用数据库时,就栽了一次.一个Group ...
- Nginx 遇到的问题
1.样式没有出来 原因:在Nginx配置中没设置好地址 解决办法:重新设置,如下 #静态资源缓存设置 location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$ { ex ...