所谓的缓存呢?其实原理很简单,就是在保证你查询的数据是正确的情况下,没有去查数据库,而是直接查找的内存,这样做有利于缓解数据库的压力,提高数据库的性能,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. OAF_开发系列13_实现OAF通过Vector动态查询设置(案例)

    20150715 Created By BaoXinjian

  2. C++坑点集合 - 1 隐式调用和默认实现的构造函数的坑

    C++是一个编译器会替你在背后做很多事情的语言,包括模板实例化,按需要创造隐式的构造函数,默认构造你没有显式构造的成员,按需进行隐式转换和饮食构造等等,如果没有彻底了解清楚,就容易被这些编译器背后做好 ...

  3. 关于Spring事务回滚的问题

    在spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例比如配置文件里有这么 ...

  4. js 毫秒转日期(yy-MM-dd hh:mm:ss)

    var seconds = "133343241342";//毫秒数 var objtime = new Date();//声明一个日期内建函数 objtime.setTime(s ...

  5. mybatis一级缓存和二级缓存

    1.一级缓存:session级别 执行以下操作之后一级缓存消失: 1)执行了session.clearCache(); 2)执行了CUD操作后 3)执行了session.close() 2.二级缓存: ...

  6. DBSCAN——python实现

    # -*- coding: utf-8 -*- from matplotlib.pyplot import * from collections import defaultdict import r ...

  7. Android学习起步 - Button按钮及事件处理

    按钮和文本框算是比较简单的控件了,以下主要讲按钮的事件响应,三种写法(匿名内部类响应事件.外部类响应事件.本类直接响应事件) 点击按钮后文本框中会显示 ”按钮被单击了”,先看效果: 以下是这个界面的布 ...

  8. chadang saidui

    http://www.freehacktools.com/   wen http://www.hackyshacky.com/2013/02/Must-have-hacking-tools.html  ...

  9. KMS服务器激活Windows和Office2013EnterprisePlus

    KMS服务器激活Windows和Office2013EnterprisePlus 参考了文档 http://wenku.baidu.com/view/0cb2602358fb770bf68a5501. ...

  10. Oracle和SQLServer解锁杀进程

    ORACLE:在平时工作中经常会遇到数据库死锁的情况,以前使用oracle时候(那时候还不懂),出现这种情况时前辈给了我一段命令:SELECT dob.OBJECT_NAME Table_Name,l ...