简介

缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力。跟Hibernate 一样,MyBatis 也有一级缓存和二级缓存,并且预留了集成第三方缓存的接口。

一级缓存

  • 什么是一级缓存?

    Mybatis一级缓存实际上就是一个依赖于SqlSession的缓存对象,PerpetualCache里面的结构很简单,通过一个k-v结构的cache维护缓存数据。一级缓存默认开启
  1. public class PerpetualCache implements Cache {
  2. private final Strng id;
  3. private Map<Object, Object> cache = new HashMap<Object, Object>();
  • 一级缓存的生命周期?

    PerpetualCache的生命周期是和SqlSession相关的,即只有在同一个SqlSession中,一级缓存才会用到。

    • 如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;
    • 如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;
    • SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用;
  • 开发时,如何才能真正用到一级缓存?

    我们经常在某个方法中进行多次数据库查询,在实际场景中,每次的数据库查询都会开启一个新的会话(SqlSession)。这种情况下我们是没有用到一级缓存的,因为根本就没有复用到SqlSession。

    那么我们怎样控制程序复用SqlSession,使get()能用到一级缓存呢?

    其中一种办法就是开启一个事务

二级缓存

  • 什么是二级缓存?

    二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存 底层还是 HashMap 架构。
  • 二级缓存的生命周期?
    1. 映射语句中的所有select语句将会被缓存
    2. 映射语句中的所有insert,update和delete语句会刷新缓存。
    3. 缓存会使用默认的Latest Recently Used(LRU,最近最少使用的)算法来回收
    4. 根据时间表,比如No Flush Interval,(CNFI,没有刷新间隔),缓存不会以任何时间顺序来刷新。
    5. 缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用
    6. 缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全的被调用者修改,不干扰其他调用者或者线程所做的潜在修改。
  • 如何才能用到二级缓存?

    二级缓存默认是不开启的,需要手动开启二级缓存,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的,否则会抛出异常。开启二级缓存的条件也是比较简单,通过直接在 MyBatis 配置文件中通过
  1. <setting name="cacheEnabled" value="true"/> <!-- 二级缓存开启 -->

或者在springboot项目配置文件中增加如下配置项:

  1. mybatis.configuration.cache-enabled=true

来开启二级缓存,还需要在 Mapper 的xml 配置文件中加入 标签

  • 设置 cache 标签的属性

    cache 标签有多个属性,一起来看一些这些属性分别代表什么意义

    • eviction: 缓存回收策略,有这几种回收策略

      • LRU - 最近最少回收,移除最长时间不被使用的对象
      • FIFO - 先进先出,按照缓存进入的顺序来移除它们
      • SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象
      • WEAK - 弱引用,更积极的移除基于垃圾收集器和弱引用规则的对象
      • 默认是 LRU 最近最少回收策略
    • flushinterval 缓存刷新间隔,缓存多长时间刷新一次,默认不清空,设置一个毫秒值

    • readOnly: 是否只读;true 只读,MyBatis 认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。MyBatis 为了加快获取数据,直接就会将数据在缓存中的引用交给用户。不安全,速度快。读写(默认):MyBatis 觉得数据可能会被修改

    • size : 缓存存放多少个元素

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

    • blocking: 若缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存。

参考

结语

欢迎关注微信公众号『码仔zonE』,专注于分享Java、云计算相关内容,包括SpringBoot、SpringCloud、微服务、Docker、Kubernetes、Python等领域相关技术干货,期待与您相遇!

Mybatis进阶使用-一级缓存与二级缓存的更多相关文章

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

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

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

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

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

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

  4. 9.Mybatis一级缓存和二级缓存

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. python xpath的基本用法

    XPath是一种在XML文档中查找信息的语言,使用路径表达式在XML文档中进行导航.学习XPath需要对XML和HTML有基本的了解. 在XPath中,有七种类型的节点:文档(根)节点.元素.属性.文 ...

  2. matplotlib柱状图、面积图、直方图、散点图、极坐标图、箱型图

    一.柱状图 1.通过obj.plot() 柱状图用bar表示,可通过obj.plot(kind='bar')或者obj.plot.bar()生成:在柱状图中添加参数stacked=True,会形成堆叠 ...

  3. Centos 7下编译安装Mysql

    (1)官网下载地址:https://dev.mysql.com/downloads/mysql/ 此处下载的是 mysql-boost-5.7..tar.gz 百度云下载地址:https://pan. ...

  4. pycharm 退出虚拟环境

    pycharm 内置虚拟环境 venv 如果要退出就直接 deactivate 命令就行 运行的话直接在命令行输python3  文件名

  5. Day15_用户注册

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...

  6. Seaborn实现多变量分析

    import seaborn as sns import numpy as np import pandas as pd import matplotlib.pyplot as plt sns.set ...

  7. PHP imageaffinematrixconcat - 连接两个矩阵

    imageaffinematrixconcat — 连接两个矩阵.高佣联盟 www.cgewang.com 语法 array imageaffinematrixconcat ( array $m1 , ...

  8. PDO::commit

    PDO::commit提交一个事务(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 bool PDO::commit ( void )高佣联盟 www.c ...

  9. Struts2中Get请求转码问题

    Tomcat默认编码为ISO859-1 Post提交时,struts2会对其转码为iso8859-1,因此不需要另外转码,而 Get提交表单,则需要单独转码,转码过程如下图:

  10. Spring学习之——手写Spring源码V2.0(实现IOC、D、MVC、AOP)

    前言 在上一篇<Spring学习之——手写Spring源码(V1.0)>中,我实现了一个Mini版本的Spring框架,在这几天,博主又看了不少关于Spring源码解析的视频,受益匪浅,也 ...