我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MyBatis一级缓存与二级缓存原理与作用是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MyBatis一级缓存与二级缓存原理与作用是什么

这篇“MyBatis一级缓存与二级缓存原理与作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyBatis一级缓存与二级缓存原理与作用是什么”文章吧。

缓存的作用

在 Web 系统中,最重要的操作就是查询数据库中的数据。但是有些时候查询数据的频率非常高,这是很耗费数据库资源的,往往会导致数据库查询效率极低,影响客户的操作体验。于是可以将一些变动不大且访问频率高的数据,放置在一个缓存容器中,用户下一次查询时就从缓存容器中获取结果。

MyBatis 的缓存结构

MyBatis 系统中默认定义了两级缓存:一级缓存和二级缓存:

MyBatis 一级缓存是一个 SqlSession 级别,Sqlsession 只能访问自己的一级缓存的数据。

二级缓存是跨 sqlSession,是 mapper 级别的缓存,对于 mapper 级别的缓存不同的 sqlsession 是可以共享的。

MyBatis 默认开启一级缓存,同时为了增强扩展性,MyBatis 定义了缓存接口 Cache,可以通过 Cache 自定义二级缓存。

一级缓存

MyBatis 一级缓存是一个 SqlSession 级别的缓存,缓存的执行遵循下方的规则:

  • 映射语句文件中的所有 select 语句的结果将会被缓存。

  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。

  • 缓存默认会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。

  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。

  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。

  • 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

接下来通过代码模拟一级缓存的执行,用的代码是最简单的一个用户类,首先第一步在 mybatis-config 中开启 log 日志:

<settings>    <setting name="logImpl" value="STDOUT_LOGGING"/></settings>

编写测试代码,在同样的查询条件下查询第二次:

public class CacheTest1 {    public static void main(String[] args) {        // 获取SqlSession        SqlSession sqlSession = MyBatisUtils.getSqlSession();        // 执行Sql        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        User user=mapper.getUserById(1);        System.out.println(user);        //同样的条件查询第二次        User user2=mapper.getUserById(1);        System.out.println(user2);        sqlSession.close();    }}

MyBatis一级缓存与二级缓存原理与作用是什么

首先这段代码是在一个 SqlSession 下,因此默认开启了一级缓存,在结果中可以看到,第一次查询走的是数据库,第二次就不需要再查数据库了。满足第一条规则:

映射语句文件中的所有 select 语句的结果将会被缓存。

修改条件,在查询第二次之前先往表里插入一条数据:

public class CacheTest2 {    public static void main(String[] args) {        // 获取SqlSession        SqlSession sqlSession = MyBatisUtils.getSqlSession();        // 执行Sql        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        User user=mapper.getUserById(1);        System.out.println(user);        //第二次查询前先插入一条数据        User user1=new User(5,"java");        mapper.insertUser(user1);        //同样的条件查询第二次        User user2=mapper.getUserById(2);        System.out.println(user2);        sqlSession.close();    }}

MyBatis一级缓存与二级缓存原理与作用是什么

在第一次查询之后插入了一条数据,第二次同样条件查询时没有走缓存,再次查表,符合规则:

映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。

二级缓存

二级缓存的作用域比一级缓存要更大,二级缓存是 mapper 级别的缓存,你也可以理解为他是一个 namespace 内的缓存。

开启二级缓存需要几个步骤:

MyBatis 中开启缓存需要首先在设置中开启 cacheEnabled

<settings>    <setting name="cacheEnabled" value="true"/>    <setting name="logImpl" value="STDOUT_LOGGING"/></settings>

cacheEnabled 默认也是开启状态。

在 mapper.xml 中使用二级缓存

在 UserMapper.xml 文件的 mapper 节点下增加一行 , 这个 mapper 就开启了二级缓存。

MyBatis 缓存要求对应的对象需要实现序列话,因此给 User 对象加上序列化

import java.io.Serializable;public class User implements Serializable{    private static final long serialVersionUID = 1L;    private int id;    private String name;    public User(){}    public User(int id,String name){        this.id=id;        this.name=name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    @Override    public String toString() {        return "id:"+this.id+" name:"+this.name;    }}

编写测试用例,下面这段代码在第一次查询结束后关闭了 SqlSession,接着重新生成一个 SqlSession 执行第二次查询,一级缓存就没有用了,这样的场景下就需要二级缓存。

public class CacheTest3 {    public static void main(String[] args) {        // 获取SqlSession        SqlSession sqlSession = MyBatisUtils.getSqlSession();        // 执行Sql        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        User user=mapper.getUserById(1);        System.out.println(user);        // 第一次查询结束后关闭 SqlSession        sqlSession.close();        sqlSession = MyBatisUtils.getSqlSession();        // 执行Sql        mapper = sqlSession.getMapper(UserMapper.class);        //同样的条件查询第二次        User user2=mapper.getUserById(1);        System.out.println(user2);        sqlSession.close();    }}

MyBatis一级缓存与二级缓存原理与作用是什么

使用 useCache 对具体某一个查询设置不适用缓存:

<select id="getUserById" resultMap="UserMap" parameterType="int" useCache="false">    select id,name from user where id=#{id};</select>

cache 标签可以通过配置进行修改:

<cache  eviction="FIFO"  flushInterval="60000"  size="512"  readOnly="false"/>

重点讲一下清除策略(eviction):

  • LRU &ndash; 最近最少使用:移除最长时间不被使用的对象。

  • FIFO &ndash; 先进先出:按对象进入缓存的顺序来移除它们。

  • SOFT &ndash; 软引用:基于垃圾回收器状态和软引用规则移除对象。

  • WEAK &ndash; 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

这里主要了解 LRU 和 FIFO 即可,默认的清除策略是 LRU。

其他几个属性的配置如下:

flushInterval(刷新间隔)属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新。

size(引用数目)属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024。

readOnly(只读)属性可以被设置为 true 或 false,默认为 false。只读的缓存会给所有调用者返回缓存对象的相同实例, 因此这些对象不能被修改,这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝,速度上会慢一些,但是更安全。

以上就是关于“MyBatis一级缓存与二级缓存原理与作用是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MyBatis一级缓存与二级缓存原理与作用是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MyBatis一级缓存与二级缓存原理与作用是什么

这篇“MyBatis一级缓存与二级缓存原理与作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyBatis一级缓存与
2023-07-04

MyBatis一级缓存与二级缓存原理与作用分析

mybatis-plus是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生,这篇文章带你了解Mybatis的一级和二级缓存
2022-12-27

mybatis一级缓存和二级缓存是什么

mybatis一级缓存和二级缓存是mybatis提供的两种不同层次的缓存机制,一级缓存是mybatis中默认开启的缓存机制,它是基于线程的本地缓存,二级缓存是基于namespace级别的缓存,可以被多个SqlSession对象共享。本教程操
2023-08-09

Java Mybatis一级缓存和二级缓存是什么

本篇内容主要讲解“Java Mybatis一级缓存和二级缓存是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Mybatis一级缓存和二级缓存是什么”吧!一、什么是缓存
2023-07-05

MyBatis中一级缓存与二级缓存的区别

今天就跟大家聊聊有关MyBatis中一级缓存与二级缓存的区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一级缓存一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sq
2023-05-31

mybatis二级缓存的原理是什么

MyBatis的二级缓存是指缓存在SqlSessionFactory级别的缓存,可以被多个SqlSession共享。其原理如下:1. 当一个查询语句被执行时,MyBatis会首先检查二级缓存中是否存在相应的缓存数据,如果存在,则直接返回缓存
2023-10-09

使用MyBatis如何实现一级缓存与二级缓存

这期内容当中小编将会给大家带来有关使用MyBatis如何实现一级缓存与二级缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。MyBatis缓存我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB
2023-05-31

深入浅析MyBatis中的一级缓存与二级缓存

本篇文章给大家分享的是有关深入浅析MyBatis中的一级缓存与二级缓存,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MyBatis缓存我们知道,频繁的数据库操作是非常耗费性能的
2023-05-31

mybatis一级缓存和二级缓存有什么区别

MyBatis的一级缓存和二级缓存是两种不同级别的缓存机制。一级缓存是在同一个SqlSession内部的缓存,它默认是开启的。在执行查询操作时,查询的结果会被缓存到一级缓存中,下次执行相同的查询操作时,会直接从缓存中获取结果,而不需要再次查
2023-08-20

Spring中一级缓存、二级缓存和三级缓存有什么作用

今天小编给大家分享一下Spring中一级缓存、二级缓存和三级缓存有什么作用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。缓存
2023-06-29

MyBatis一级与二级缓存相关配置

mybatis-plus是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生,这篇文章带你了解Mybatis的一级和二级缓存
2023-01-03

MyBatis中二级缓存和一级缓存有什么区别

MyBatis中的一级缓存是SqlSession级别的缓存,即在同一个SqlSession中执行相同的查询,第一次查询结果会被缓存下来,后续再执行相同的查询时,直接从缓存中获取结果,提高查询效率。但是一级缓存的生命周期比较短,当SqlSes
MyBatis中二级缓存和一级缓存有什么区别
2024-03-07

MyBatis动态SQL与缓存原理是什么

今天小编给大家分享一下MyBatis动态SQL与缓存原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。动态SQL为什么
2023-07-05

java二级缓存的实现原理是什么

Java二级缓存是一种应用级缓存,它通过将数据存储在内存中,以减少对底层数据源的访问次数,提高数据访问的性能。实现Java二级缓存的原理可以简单概括为以下几个步骤:1. 创建缓存对象:在应用启动时,创建一个缓存对象,并指定缓存的容量大小。2
2023-10-09

Hibernate一级缓存是什么

本篇内容介绍了“Hibernate一级缓存是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在学习Hibernate中,我们都知道由于一级
2023-06-17

如何利用Redis作为Mybatis的二级缓存

目录前言要优雅就选择MyBATis-PlusRedis配置自定义Mybatis缓存测试缓存命中率(Cache Hit Ratio)一级缓存和二级缓存什么时候该开启二级缓存前言今天在开发时发现一个奇怪的问题,我手动改完数据库竟然不生效,反复
2022-08-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录