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


相关推荐

  • ConcurrentHashMap源码分析(JDK8版本)

    ConcurrentHashMap源码分析(JDK8版本)注:本文源码是JDK8的版本,与之前的版本有较大差异ConcurrentHashMap是conccurrent家族中的一个类,由于它可以高效地支持并发操作,以及被广泛使用,经典的开源框架Spring的底层数据结构就是使用ConcurrentHashMap实现的。与同是线程安全的老大哥HashTable相比,它已经更胜一筹,因此它的锁更加细化.

    2022年6月24日
    28
  • java专业是什么专业,写的太详细了「建议收藏」

    java专业是什么专业,写的太详细了「建议收藏」前言SQL语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关注的问题。在生产环境中,SQL执行慢是很严重的事件。那么如何定位慢SQL、慢的原因及如何防患于未然。接下来带着这些问题让我们开启本期之旅!第1章:Dubbo的简史、后续的规划和整体架构大图————Dubbo高性能RPC通信框架1.1应用架构演进过程1.2Dubbo简介1.3Dubbo总体大图第2章:Dubbo的环境配置和基于Dubbo开发第一款应用程序————开发第一款Dubbo应用程序

    2022年7月7日
    24
  • .htaccess文件中RewriteCond详解

    .htaccess文件中RewriteCond详解Apache中RewriteCond语句对于我来说一直是个难点,多次试图去把它搞明白,都没有结构,这次我终于算大概知道它的意思了RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。复制代码代码如下:…

    2022年5月25日
    36
  • springboot配置多个yml_spring几种配置方式

    springboot配置多个yml_spring几种配置方式YMLrabbitmq:first:username:${app.appkey}password:${app.appkey}virtual-host:${app.appid}addresses:x.x.x.x:5672,x.x.x.x:5672second:username:guestpassword:guestvirtual-host:/host:12

    2022年10月3日
    4
  • Http响应头里Cache-Control:no-cache、max-age=””和no-store

    Http响应头里Cache-Control:no-cache、max-age=””和no-store响应头:Cache-Control:no-cache,强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据 的应用(不惜牺牲使用缓存的所有好处)通俗解释:浏览器通知服务器,本地没有缓存数据//======================================================…

    2022年6月13日
    32
  • 在同一台电脑上同时安装Python2和Python3

    在同一台电脑上同时安装Python2和Python3

    2021年10月16日
    40

发表回复

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

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