所谓的缓存呢?其实原理很简单,就是在保证你查询的数据是正确的情况下,没有去查数据库,而是直接查找的内存,这样做有利于缓解数据库的压力,提高数据库的性能,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一级缓存和二级缓存的更多相关文章

  1. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  2. MyBatis 延迟加载,一级缓存,二级缓存设置

    什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...

  3. mybatis高级(3)_延迟加载_深度延迟_一级缓存_二级缓存

    设置延迟加载需要在mybatis.xml中设置 注: 侵入式延迟加载为真时是延迟加载 侵入式延迟加载为假时是深度延迟加载 <!-- 延迟加载和深度延迟加载 --> <settings ...

  4. 八 mybatis查询缓存(一级缓存,二级缓存)和ehcache整合

    1       查询缓存 1.1     什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存.

  5. myBatis学习(9):一级缓存和二级缓存

    正如大多数持久层框架一样,MyBatis同样提供了一级缓存和二级缓存的支持 1. MyBatis一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为 Session,默认情 ...

  6. mybatis 详解(九)------ 一级缓存、二级缓存

    上一章节,我们讲解了通过mybatis的懒加载来提高查询效率,那么除了懒加载,还有什么方法能提高查询效率呢?这就是我们本章讲的缓存. mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解 ...

  7. MyBatis从入门到放弃六:延迟加载、一级缓存、二级缓存

    前言 使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMa ...

  8. Mybatis第八篇【一级缓存、二级缓存、与ehcache整合】

    Mybatis缓存 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. myba ...

  9. MyBatis 一级缓存,二级缓存,延迟加载设置

       1  什么是延迟加载  resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再 ...

随机推荐

  1. 关于delegate(代理)总结

    stackoverflow  上讲解:http://stackoverflow.com/a/12660523/4563358 delegate是将需要处理交给自己的代理. 在自己的对应的类中.h文件中 ...

  2. CentOS 6.5下静默安装oracle

    本例: 通过SSH远程连接云主机,上传oracle11g安装包,在centos6.5上无图形化界面静默安装oracle11g. 涉及工具及环境: 1.本地环境windows7+ssh远程连接工具xSh ...

  3. asp.net 手工调用 WS(Get)方法:

    asp.net 手工调用 WS(Get)方法: 通过手工HttpWebRequest,HttpWebResponse来模拟调用.核心代码:string strurl="http://loca ...

  4. java 配置文件读取

    1.getResourceAsStream Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path ...

  5. 仿QQ消息气泡提醒

    https://github.com/dkmeteor/Bubble-Notification   感谢这位作者,本例子只是封装了一下源码. 这是jar下载地址 下载之后只要引用就好.下面是一个最简单 ...

  6. nodejs——qureystring的作用

    当node服务器向另一个服务器发送数据时,首先要转换成字符串再post或者get,这个时候就要用到node内置的这个包querystring, querystring.stringify(data);

  7. 【ORM】--FluentNHibernate之AutoMapping详解

           上篇文章详细讨论了FluentNHibernate的基本映射的使用方法,它的映射基本用法是跟NHibernate完全一样的,首先要创建数据库链接配置文件,然后编写Table的Mappin ...

  8. 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 ...

  9. 数据库的NULL值讨论

    有许多关于数据库设计中NULL的讨论,我个人的设计习惯是,不使用NULL值. 我所设计所有表都是Not Null的字段的,尤其是我主要做数据仓库的表设计.刚开始使用数据库时,就栽了一次.一个Group ...

  10. Nginx 遇到的问题

    1.样式没有出来 原因:在Nginx配置中没设置好地址 解决办法:重新设置,如下 #静态资源缓存设置 location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$ { ex ...