Mybatis中的缓存
Mybatis提供缓存查询功能,用于减轻数据库压力,提升数据查询能力。
Mybatis中定义了两级缓存:包括一级缓存与二级缓存。示意图如下所示:

一、一级缓存
一级缓存的特点:
- 每一个SqlSession都有一个一级缓存,且它们的缓存数据区域之间互不影响。
- 一级缓存是默认开启的,开发人员不能关闭。
一级缓存又称为会话缓存,是SqlSession级别的缓存,它的作用域是同一个SqlSession,在查询数据时会创建SqlSession对象,其中会有一个HashMap进行数据的缓存,在同一个SqlSession执行两次相同的sql语句的过程中,第一次查询完毕会将查询的数据写到缓存中,第二次会直接从缓存中获取查询结果,不用去数据库进行查询,提升了查询效率。查询过程如下图所示:

如图所示,SqlSession进行查询的过程如下:
- 在发起查询过程中,会首先去一级缓存进行查询,若没有,则去数据库进行数据查询。
- 得到查询的数据结果,将其存储到一级缓存中。
- 第二次进行相同sql的查询时,会先去缓存中进行数据查询,若有,则直接从缓存中获取数据。
Mybatis一级缓存的内部,是以HashMap的方式进行存储的,其中Key值为hashCode+sqlId+Sql语句,value为从数据库查出来的数据结果映射成的Java对象。
注意:
在上图中发现在进行了修改,添加,删除用户的操作时,SqlSession会执行commit操作刷新SqlSession中的一级缓存。目的是为了更新缓存中的数据信息,避免脏读。
一级缓存失效的情况:同一个用户使用两个SqlSession,
二、二级缓存
二级缓存的特点:
- 二级缓存默认是关闭的,需要开发人员开启。
- 二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,可以理解为它针对的是一个表的缓存
- 一个SqlSession对象将要被销毁时,MyBatis会自动将这个SqlSession中与当前表关联的数据存放到这个二级共享缓存中
二级缓存又称全局缓存,它是根据mapper的namespace划分的,相同namespace的mapper查询数据放在同一个区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分。它的查询过程如下图所示:

与一级缓存类似,每次查询会先从缓存区域找,如果找不到再从数据库查询,并将查询到数据将数据写入缓存。SqlSession执行insert、update、delete等操作commit提交后会刷新缓存区域。同时它的存储也是基于HashMap的,key值也为hashCode+sqlId+Sql语句。
三、缓存相关属性
1、开启/禁用二级缓存
二级缓存的开启/禁用是在核心配置文件中的<settings>标签中配置的。
<settings>
<!-- 通知MyBatis框架开启二级缓存 -->
<!-- <setting name="cacheEnabled" value="true"/> -->
<!-- 通知MyBatis框架关闭二级缓存 -->
<setting name="cacheEnabled" value="false"/>
</settings>
2、useCache属性
useCache配置在mapper.xml文件中,且只会出现在select标签中。useCache默认值就是true,当置false时,对于一级缓存没有影响,只是与SqlSession相关联的查询结果在第一个SqlSession关闭时是不会放到二级缓存中。
<select id="findUsertById" resultType="user" useCache="true">
3、刷新缓存
flushCache是刷新缓存的属性,它配置在mapper.xml文件中,它用于决定当前sql执行完毕后,是否会刷新(清空)缓存。flushCache可以配置在添加,更新,删除,查询标签中。
flushCache配置在添加,更新,删除标签中时,它的默认值为true。
- 当flushCache为true时,在执行过程中会清空一级缓存数据/清空二级缓存对应的mapper.xml所有数据,会即时修改缓存中的数据,避免出现脏读。
- 当flushCache为false时,在执行过程中会清空一级缓存数据/不会清空二级缓存数据
flushCache配置在<select>标签中时,它的默认值为false。
- 当flushCache为false时,一级缓存和二级缓存都可以使用
- 当flushCache为true时,查询结果不会保存到一级缓存和二级缓存
4、clearCache()方法
sqlSession.clearCache()只会清空当前会话的一级缓存,不会影响数据保存到二级缓存
参考了:https://www.cnblogs.com/zhangzongle/p/6211285.html
Mybatis中的缓存的更多相关文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- SSM-MyBatis-17:Mybatis中一级缓存(主要是一级缓存存在性的证明,增删改对一级缓存会造成什么影响)
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 缓存------------------------------------------> 很熟悉的一个 ...
- mybatis中的缓存问题
关于mybatis基础我们前面几篇博客已经介绍了很多了,今天我们来说一个简单的问题,那就是mybatis中的缓存问题.mybatis本身对缓存提供了支持,但是如果我们没有进行任何配置,那么默认情况下系 ...
- 关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- Mybatis中的缓存管理
目录 Mybatis中的缓存管理 查询缓存工作原理: 配置缓存: 默认配置: 使用二级缓存: 刷新缓存过程: 配置EHcache 产生脏数据 使用原则: Mybatis中的缓存管理 查询缓存工作原理: ...
- SSM-MyBatis-18:Mybatis中二级缓存和第三方Ehcache配置
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 二级缓存 Mybatis中,默认二级缓存是开启的.可以关闭. 一级缓存开启的.可以被卸载吗?不可以的.一级缓存 ...
- MyBatis中的缓存1
1.应用程序和数据库交互的过程是一个相对比较耗时的过程 2.缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行的xiaolv 3.MyBatis中默认SqlSession缓存开启 3.1 同 ...
- MyBatis中二级缓存和延时加载同时开启的问题
首先,二级缓存默认不开启! 要配置 <setting name="cacheEnabled" value="true"/> 在MyBatis中:一级 ...
- 一次读懂mybatis中的缓存机制
缓存功能针对于查询(没听说果UPDATE,INSERT语句要缓存什么,都是直接执行的) 默认情况下,mybatis会启用一级缓存. 如果使用同一个session对象调用了相同的SELECT语句,则直接 ...
随机推荐
- 使用Flask+uwsgi+Nginx部署Flask正式环境
环境准备 在开始正式讲解之前,我们将首先进行环境准备. Step1:安装Python,pip以及nginx: sudo apt-get update sudo apt-get install pyth ...
- 微信赌场——H5棋牌游戏渗透之旅
i春秋作家:F0rmat 0x01 前言 本来不想发的,涉及太多利益了,这些棋牌游戏的源码最高能卖到几万.开发起来不比一个商场程序难.最近又太忙了,没时间去做代码审计的文章了,但一不小心又抢了个运气王 ...
- SQL Server清理大日志文件方法 不分离数据库 执行SQL语句即可
SQL 2008清空日志的SQL语句如下: USE[master] GO ALTER DATABASE 要清理的数据库名称 SET RECOVERY SIMPLE WITH NO_WAIT GO AL ...
- C# 多线程学习系列三之CLR线程池系列之ThreadPool
一.CLR线程池 1.进程和CLR的关系一个进程可以只包含一个CLR,也可以包含多个CLR2.CLR和AppDomain的关系一个CLR可以包含多个AppDomain3.CLR和线程池的关系一个CLR ...
- 一口一口吃掉Hexo(四)
如果你想得到更好的阅读效果,请访问我的个人网站 ,版权所有,未经许可不得转载! 人总是不会满足于现状,接下来我们就可以让我们的朋友们通过独立域名访问我们的网站了,但是这肯定是要花点钱的,所以这篇文章难 ...
- MySql 高可用架构Atlas
Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug ...
- LockSupport 阻塞原语
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark() ...
- 微信小程序——豆瓣电影——(2):小程序运行部署
Demo 预览 演示视频(流量预警 2.64MB) GitHub Repo 地址 仓库地址:https://github.com/zce/weapp-demo 使用步骤 将仓库克隆到本地: bash ...
- Java 容器源码分析之集合类详解
集合类说明及区别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └W ...
- 外网配置花生壳动态域名解析实现外网访问本地iis及vs实时调试
描述:假如已连外网,具备一台路由器的情况下在路由器设置页面配置花生壳动态域名解析,使得外网可以访问到本地iis 托管的web服务,模拟真实环境调试应用程序. 网络运营商ip的动态分配,通常网络提供商给 ...