重要概念

  • SqlSession:代表和数据库的一次会话,提供了操作数据库的方法。

  • MappedStatement:代表要发往数据执行的命令,可以理解为SQL的抽象表示。

  • Executor:和数据库交互的执行器,接收MappedStatement。

  • 映射接口:在接口中会要执行的SQL用一个方法表示,具体SQL写在映射文件中。

  • 映射文件:编写SQL的文件。

一级缓存介绍

在代码运行时,有可能会在一个数据库会话中执行多次相同的SQL,这种反复的查询会带来开销。

每一个SqlSession都持有自己的缓存,就是LocalCache。一种是Session级别的,在Mybatis中执行的所有语句都会共享这一个缓存。一种是Statement级别的,缓存只对当前statement语句。

当发起查询时,Mybatis会根据statementId、params、rowBounds生成一个key,去Cache查,如果没有的话会去数据库查,并且缓存到本地。

一级缓存的不足

使用一级缓存的时候,因为缓存不能跨会话共享,不同的会话之间对于相同的数据可能有不一样的缓存。在有多个会话或者分布式环境下,会存在脏数据的问题。如果要解决这个问题,就要用到二级缓存。MyBatis 一级缓存无法关闭,但是有两种级别可选:

  1. session级别的缓存,在同一个sqlSession内,对同样的查询将不再查询数据库,直接从缓存中取。

  2. statement级别的缓存,为了避免上述问题,可以将一级缓存的级别设为 statement 级别的,这样每次查询结束都会清掉一级缓存。

二级缓存

二级缓存是用来解决一级缓存不能跨会话共享的问题的,在XML文件配置后可以被多个SqlSession共享,生命周期和应用同步。

如果MyBatis使用了二级缓存,并且Mapper和select语句也配置使用了二级缓存,那么在执行select查询的时候,MyBatis会先从二级缓存中取输入,其次才是一级缓存。

即MyBatis查询数据的顺序是:二级缓存 —> 一级缓存 —> 数据库。

https://www.cnblogs.com/wuzhenzhao/p/11103043.html

一、二级缓存的使用注意点

  • MyBatis默认的session级别一级缓存,由于Spring Boat 中默认使用了hikariCP,所以基本没用,需要开启事务才有用。但一级缓存作用域仅限同一sqlSession内,无法感知到其他sqlSession的增删改,所以极易产生脏数据。

  • 二级缓存可通过cache-ref让多个mapper.xml共享同一namespace,从而实现缓存共享,但多表联查时配置略微繁琐。

  • 生产环境建议将一级缓存设置为statment级别(即关闭一级缓存),如果有必要,可以开启二级缓存。

  • 在分布式环境中也是不建议开启二级缓存的,因为缓存是保存到本地的,这样也会导致产生脏数据。

MyBatis的缓存玩法的更多相关文章

  1. 一种通过MQ使缓存和数据库同步的玩法

    其他相关玩法 可以搜索 mysql 和 redis 结合使用

  2. git分布式版本控制玩法

    git分布式版本控制玩法 Git distributed version control play github的配置安装步骤:1.下载git bash(从http://www.git-scm.com ...

  3. Mybatis的缓存

    1.缓存是什么 在 Mybatis 里面,所谓的缓存就是将已经查询过的记录放在内存的缓冲区或文件上,这样如果再次查询,可以通过配置的策略,命中已经查询过的记录,从而提高查询的效率. Mybatis 的 ...

  4. 全面解密QQ红包技术方案:架构、技术实现、移动端优化、创新玩法等

    本文来自腾讯QQ技术团队工程师许灵锋.周海发的技术分享. 一.引言 自 2015 年春节以来,QQ 春节红包经历了企业红包(2015 年).刷一刷红包(2016 年)和 AR 红包(2017 年)几个 ...

  5. 朱晔的互联网架构实践心得S2E4:小议微服务的各种玩法(古典、SOA、传统、K8S、ServiceMesh)

    十几年前就有一些公司开始践行服务拆分以及SOA,六年前有了微服务的概念,于是大家开始思考SOA和微服务的关系和区别.最近三年Spring Cloud的大火把微服务的实践推到了高潮,而近两年K8S在容器 ...

  6. 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)

    版权声明:本文由张宁原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/126547001488207964 来源:腾云阁 ht ...

  7. 深入了解MyBatis二级缓存

    深入了解MyBatis二级缓存 标签: mybatis二级缓存 2015-03-30 08:57 41446人阅读 评论(13) 收藏 举报  分类: Mybatis(51)  版权声明:版权归博主所 ...

  8. 170315、spring:@Autowired等注解的别样玩法

    适用场景: 1.IOC容器完成启动就想加载进来的数据 2.多个已经定义好的组件,想在使用的时候通过一行代码就全部拿到 3.等等.... 联想:@Autowired.@Resources等也可以类似使用 ...

  9. openresty+lua在反向代理服务中的玩法

    openresty+lua在反向代理服务中的玩法 phith0n · 2015/06/02 10:35 0x01 起因 几天前学弟给我介绍他用nginx搭建的反代,代理了谷歌和维基百科. 由此我想到了 ...

随机推荐

  1. [ASP.NET MVC]@Scripts.Render、@Styles.Render的使用

    一.配置BundleConfig.cs文件 1.首先要在App_Start 里面BundleConfig.cs 文件里面 添加要包含的css文件 2.BundleConfig就是一个微软新加的 一个打 ...

  2. 剑指offer面试题4

    1 #include<iostream> 2 using namespace std; 3 4 void replace(char ch[]) { 5 int count = 0; 6 i ...

  3. Docker容器 关于镜像构建的安全问题

    写在前面 确保容器中服务与应用安全是容器化演进的关键点.容器安全涉及到应用开发与维护的整个生命周期,本文主要从镜像构建的视角来看docker容器的一些安全问题及应对措施. 一.权限管理 1.避免以容器 ...

  4. 前端调用后台接口下载word文档的两种方法

    1传统的ajax虽然能提交到后台,但是返回的数据被解析成json,html,text等字符串,无法响应浏览器下载.就算使用bob模拟下载,数据量大时也不方便 废话不多说:上代码(此处是Layui监听提 ...

  5. Mac automator bash 自动操作 右键菜单unrar解压 拷贝文件路径到剪贴板 快速删除(rm -rf) 快捷键设置

    https://tecadmin.net/pass-command-line-arguments-in-shell-script/ https://tecadmin.net/tutorial/bash ...

  6. vue 用driver 添加用户引导

    npm 安装: npm install driver.js //用户引导 import Driver from 'driver.js' import 'driver.js/dist/driver.mi ...

  7. 第18章-x86指令集之常用指令

    x86的指令集可分为以下4种: 通用指令 x87 FPU指令,浮点数运算的指令 SIMD指令,就是SSE指令 系统指令,写OS内核时使用的特殊指令 下面介绍一些通用的指令.指令由标识命令种类的助记符( ...

  8. MySQL——MySQL安装

    1.rpm yum安装:安装方便.速度快.无法定制 2.二进制安装:解压即可使用,不能定制功能 3.编译安装: 可定制.安装慢: MySQL5.5之前:./configure make make in ...

  9. C# Equals方法和==有什么区别

    开发工具:VS2019 一.关于这两个比较,需要从值类型和引用类型两方面来说 (A)先说值类型 上图: 因为在对值类型进行比较时候,不管 .Equals() 方法还是 == 方法,都是对值类型变量(图 ...

  10. noip模拟测试52

    这套题总体来说比较简单,但是有一些分数我没有拿到,先说T1,我10分钟左右打完了60分的暴力,然后就开始打表找规律,好像只有我去找了循环节,找规律找了一个多小时,到八点四十的时候我还没有正解做法,就直 ...