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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • arping 命令解析

    arping 命令解析一、介绍ARP协议是“AddressResolutionProtocol”(地址解析协议)的缩写。在同一以太网中,通过地址解析协议,源主机可以通过目的主机的IP地址获得目的主机的MAC地址。arping程序就是完成上述过程的程序。arping,用来向局域网内的其它主机发送ARP请求的指令,它可以用来测试局域网内的某个IP是否已被使用。 二、指令格式如下:arping[-AbDfhqUV][…

    2022年5月1日
    50
  • 如何在pycharm中进行全局搜索

    如何在pycharm中进行全局搜索使用doubleshift可以在整个项目中搜索含关键字在项目中的位置及关键字在文件中的位置。

    2022年5月15日
    55
  • mysql decimal 实现_mysql decimal数据类型转换的实现示例

    mysql decimal 实现_mysql decimal数据类型转换的实现示例mysqldecimal数据类型转换的实现示例发布时间:2021-02-1408:40:00来源:亿速云阅读:85作者:小新小编给大家分享一下mysqldecimal数据类型转换的实现示例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!最近在工作遇到数据库中存的数据类型是:decimal(14,4)遇到的问题是:当我使用python读取到内存中时,总是带着decimal…

    2022年7月17日
    19
  • html+JavaScript登陆注册界面

    html+JavaScript登陆注册界面最近刚刚学习了一些关于JavaScript的知识,便在之前学习的html前端的基础上做了一些简单的修改,本身还存在着很多的缺陷,希望大家多多指正。githu下载地址:https://github.com/pengxiang1998/login[登陆界面2在线预览]:https://pengxiang1998.github.io/login/index/denglu.html[注…

    2022年6月9日
    42
  • DropDownList绑定数据的几种方式

    DropDownList绑定数据的几种方式1.视图中添加可以直接通过单击属性"Items"后的按钮为某一DropDownList控件添加数据项。每添加一项数据就是添加了一个ListItem(列表控件中的数据项)。这种方式

    2022年7月3日
    26
  • 时序数据库 mysql_时序数据库 应用场景

    时序数据库 mysql_时序数据库 应用场景influxDB介绍时间序列数据是以时间字段为每行数据的标示,比如股票市场的价格,环境中的温度,主机的CPU使用率等。但是又有什么数据是不包含timestamp的呢?几乎所有的数据都可以打上一个timestamp字段。时间序列数据更重要的一个属性是如何去查询它。在查询的时候,对于时间序列我们总是会带上一个时间范围去过滤数据。同时查询的结果里也总是会包含timestamp字段。InfluxDB是一…

    2022年10月4日
    2

发表回复

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

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