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)
上一篇 2026年2月5日 上午10:43
下一篇 2026年2月5日 上午11:15


相关推荐

  • 文件操作(File类等)API摘要[通俗易懂]

    文件操作(File类等)API摘要[通俗易懂]Console此类包含多个方法,可访问与当前Java虚拟机关联的基于字符的控制台设备(如果有)。虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。如果此虚拟机具

    2022年5月27日
    38
  • pycharm linux 下激活成功教程

    pycharm linux 下激活成功教程原 Linux 下安装 Pycharm 专业版并激活 2018 年 01 月 24 日 02 31 57 阅读数 37071 首先去官网下载对应的 pycharm 拷贝到 opt 目录 解压 进入 bin 目录 运行 pycharm sh 如图 2 激活 nbsp 运行 pycharm sh 后如下图 选择激活码激活 激活码 http

    2026年3月27日
    2
  • Vue定时器设置 Vue简单定时任务

    Vue定时器设置 Vue简单定时任务创建定时器 Vue 的定时器分为好几种的呢 在这里我简单的写了三种来看一下 这三种分别是一次性定时器 指定时间间隔触发定时器 清除定时器 1 1 一次性定时器 第二个参数是毫秒数 lettimer setTimeout gt 需要定时执行的代码 console debug HelloWorld 3000 1 2 指定时间间隔触发定时器 lettimer setInterval gt 需要定时执行的代码 500

    2026年3月26日
    1
  • docker启动mysql并打开远程连接「建议收藏」

    docker启动mysql并打开远程连接「建议收藏」1.获取mysql:拉去mysql镜像dockerpullmysql:8.02.启动mysql#–name指定容器名字-v目录挂载-p指定端口映射-e设置mysql参数-d后台运行dockerrun–namemysql-v/usr/local/mysql/data:/var/lib/mysql-v/usr/local/mysql:/etc/mysql/conf.d-v/usr/local/mysql/log:/var/log/mysql-eMYSQL

    2026年4月16日
    5
  • 收藏一下,虽然很多东西还没接触到

    操作系统和类型(2007-8-15 22:17)1、操作系统概念是计算机系统的一种系统软件,由它统一管理计算机系统的资源和控制程序的执行。2、分类(1)批处理操作系统 

    2021年12月27日
    50
  • Collections工具类

    Collections工具类Collections 工具类概念 集合工具类 定义了除了存取以外的集合常用方法 方法 publicstatic List list 反转集合中元素的顺序 publicstatic List list 随机重置集合元素的顺序 publicstatic List T list 升序排序 元素类型必须实现 Comparable 接口 COPY 演示 T

    2026年3月16日
    1

发表回复

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

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