mybatis一级缓存和二级缓存失效_mybatis二级缓存默认开启吗

mybatis一级缓存和二级缓存失效_mybatis二级缓存默认开启吗1.缓存介绍Mybatis提供查询缓存,如果缓存中有数据就不用从数据库中获取,用于减轻数据压力,提高系统性能。Mybatis的查询缓存总共有两级,我们称之为一级缓存和二级缓存,如图:一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1.缓存介绍

Mybatis提供查询缓存,如果缓存中有数据就不用从数据库中获取,用于减轻数据压力,提高系统性能。

Mybatis的查询缓存总共有两级,我们称之为一级缓存和二级缓存,如图:

d98d6cb61841

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

二级缓存是Mapper(namespace)级别的缓存。多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

2.一级缓存

(1) Mybatis默认开启了一级缓存

(2)原理图

d98d6cb61841

第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息,将查询到的用户信息存储到一级缓存中。

如果中间sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

3.二级缓存

(1) 二级缓存是namespace级别的,默认不开启

(2) 开启步骤

1) 

2) 在mapper.xml中 加入标签 核心参数可不设置 使用默认参数

(3) 原理图

d98d6cb61841

第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内。

第二次调用相同namespace下的mapper映射文件中相同的SQL去查询用户信息。会去对应的二级缓存内取结果。

如果调用相同namespace下的mapper映射文件中的增删改SQL,并执行了commit操作。此时会清空该namespace下的二级缓存。

禁用二级缓存

默认二级缓存的粒度是Mapper级别的,但是如果在同一个Mapper文件中某个查询不想使用二级缓存的话,就需要对缓存的控制粒度更细。

在select标签中设置useCache=false,可以禁用当前select语句的二级缓存,即每次查询都是去数据库中查询,默认情况下是true,即该statement使用二级缓存。

resultType=”com.kkb.mybatis.po.User”useCache=”true”>

SELECT * FROM user WHERE id = #{id}

刷新二级缓存

通过flushCache属性,可以控制select、insert、update、delete标签是否属性二级缓存

默认设置

*默认情况下如果是select语句,那么flushCache是false。

*如果是insert、update、delete语句,那么flushCache是true。

默认配置解读

*如果查询语句设置成true,那么每次查询都是去数据库查询,即意味着该查询的二级缓存失效。

*如果增删改语句设置成false,即使用二级缓存,那么如果在数据库中修改了数据,而缓存数据还是原来的,这个时候就会出现脏读。

flushCache设置如下:

resultType=”com.kkb.mybatis.po.User”useCache=”true”flushCache=”true”>

SELECT * FROM user WHERE id =#{id}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191233.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图解Kafka中的数据采集和统计机制 | 文末送30本书任你选[通俗易懂]

    图解Kafka中的数据采集和统计机制 | 文末送30本书任你选[通俗易懂]在讲解kafka限流机制之前,我想先讲解一下Kafka中的数据采集和统计机制你会不会好奇,kafka监控中,那些数据都是怎么计算出来的比如下图这些指标这些数据都是通过Jmx获取的kafka监控指标,那么我们今天老探讨一下,这些指标都是怎么被计算出来的在开始分析之前,我们可以自己思考一下如果让你统计前一分钟内的流速,你会怎么统计才能够让数字更加精确呢?我相信你脑海中肯定出现了一个词:滑动窗口在kafka的数据采样和统计中,也是用了这个方法,通过多个样本Sample进行采样,并合并统计当然

    2022年5月12日
    38
  • jQuery中AJAX写法「建议收藏」

    jQuery中AJAX写法「建议收藏」前言  在jQuery中AJAX的写法有3种,$ajax,$post,$get这三种。其中$post和$get是简易写法,高层的实现,在调用他们的时候,会运行底层封装好的$ajax。运用get方式一$.get("test.cgi",{name:"John",time:"2pm"},function(data){alert("DataLoaded:"+data…

    2022年9月30日
    3
  • js 字符串截取slice、substring、substr

    js 字符串截取slice、substring、substr1、slice//slice()方法用于从原字符串取出子字符串并返回,不改变原字符串。它的第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置)。’JavaScript’.slice(0,4)//”Java”//如果省略第二个参数,则表示子字符串一直到原字符串结束。’JavaScript’.slice(4)//”Script”//如果参数是负值,表示从结尾开始倒数计算的位置,即该负值加上字符串长度。’JavaScript’.slice(-6)//”S

    2022年5月27日
    52
  • ghost备份和还原_cgi备份还原

    ghost备份和还原_cgi备份还原制作系统镜像

    2025年9月17日
    4
  • 零基础学Java(2)数据类型与变量

    零基础学Java(2)数据类型与变量前言Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共8种基本类型,其中有4种整型、2种浮点型、1种字符串类型char(用于表示Unicode编码的代码单元)和1种

    2022年7月31日
    7
  • mybatiscodehelperpro2.8.3激活码_navicat premium激活

    mybatiscodehelperpro2.8.3激活码_navicat premium激活目录一、前言二、安装插件MyBatisCodeHelperPro插件三、激活一、前言在开发中编写生成bean,mapper,mapper.xml即费时也费力,可以通过MyBatisCodeHelperPro自动生成bean,dao,mapper.xml等文件,然后根据自己的需要进行修改。MyBatisCodeHelperPro是IDEA下的一个插件,类似于mybatisplugin,但是是收费的,但可以进行激活使用:下面这个大佬的个人主页上有多个版本的下载链…

    2022年9月21日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号