mybatis缓存机制
文章目录
- 缓存介绍
- 一级缓存
- 二级缓存
- 二级缓存使用步骤
- 二级缓存和一级缓存的区别:
缓存介绍
缓存主要是对查询起作用,减轻数据库的压力,提高数据库的性能
mybatis中提供了一级缓存、二级缓存
一级缓存是SQLSession级别的缓存,同一个SQLSession上的查询可以使用一级缓存,不同的SQLSession缓存是相互独立的,互不影响
二级缓存是mapper级别的缓存,多个SQLSession会命中二级缓存,及二级缓存可以在多个SQLSession之间共享
一级缓存
一级缓存是SQLSession级别缓存,一级缓存的作用域是一个SQLSession,在同一个sqlsession下两次执行相同的SQL查询操作,第一次执行完毕后会将数据库中查询的数据写入缓存,第二次会从缓存中获取数据则不从数据库中获取,提高查询效率,当SQLSession结束,缓存也就随之失效
mybatis是默认开启一级缓存
注意:缓存起作用是对同一个数据而言,必须是连续的查询操作,第一次操作之后缓存会起作用,在第一次查询之后对同一个数据做变更/删除操作,缓存会被清空,后续查询中的第一个查询是需要到数据库查询
一级缓存测试:
mybatis默认支持的,不需要配置
同一个session下连续查询操作:
二级缓存
mybatis的二级缓存是mapper级别的缓存,默认是关闭的
对同一个mapper其不同的SQLSession可以共享二级缓存,不同的mapper是相互独立的
二级缓存的使用需要打开二级缓存配置,映射的java对象实现序列化
二级缓存使用步骤
1、在mybatis的全局配置文件中打开二级缓存的开关
<settings><!--二级缓存的配置信息--><setting name="cacheEnabled " value="true"/></settings>
2、将映射的对象实现序列化
public class Student implements Serializable
3、在mapper中使用cache标签
<!--cache标签flushInterval(刷新时间) 是正整数,单位是毫秒,默认不设置,即没有刷新时间size(引用数据) 正整数,默认1024,记录是缓存的对象的数目readOnly(只读) eviction:给定缓存回收策略LRU:最近最少使用的,移除长时间不使用缓存对象FIFO:先进先出,按照对象进入缓存的顺序来移除对象soft:软引用:移除基于垃圾回收状态和软引用规则的对象weak:弱引用:移除弱引用所作用的对象--><cache flushInterval="60000" size="512" readOnly="true" eviction="LRU"/>
二级缓存的测试:
useCache:配置禁用缓存
在Statement上设置useCache="false"禁用select查询的二级缓存,即每次查询都会去数据库,不使用二级缓存
二级缓存和一级缓存的区别:
二级缓存的范围更大,多个SQLSession可以共享一个mapper中的二级缓存,
每一个mapper都有一个二级缓存,如果mapper的namespace如果相同,这两个mapper执行查询SQL查询到的数据将存在相同的二级缓存区域中
一级缓存,二级缓存 SQLSession->defaultSqlSession ->CachingExecutor
一级缓存:LocalCache
二级缓存:tcm
执行优先级源码
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {Cache cache = ms.getCache();if (cache != null) {//是否为二级缓存this.flushCacheIfRequired(ms);if (ms.isUseCache() && resultHandler == null) {this.ensureNoOutParams(ms, parameterObject, boundSql);List<E> list = (List)this.tcm.getObject(cache, key);if (list == null) {list = this.delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);this.tcm.putObject(cache, key, list);}return list;}}return this.delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);}
mybatis缓存机制相关推荐
- MyBatis复习笔记6:MyBatis缓存机制
MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...
- 【转】MyBatis缓存机制
转载:https://blog.csdn.net/bjweimengshu/article/details/79988252. 本文转载自公众号 美团技术点评 前言 MyBatis是常见的Java数据 ...
- MyBatis缓存机制之一级缓存
MyBatis缓存机制之一级缓存 前言 MyBatis内部封装了JDBC,简化了加载驱动.创建连接.创建statement等繁杂的过程,是我们常见的持久性框架.缓存是在计算机内存中保存的临时数据,读取 ...
- [Professor麦]深入剖析Mybatis缓存机制
哈哈哈,终于考完试了,用了大概两天时间肝了这篇文章!!! 关于今天要讲的mybatis缓存机制,其实之前我已经有看过也用过,只不过平常不太留意,最近在看mybatis源码,就来讲一下这个缓存机制 前言 ...
- 13.MyBatis缓存机制
13.MyBatis缓存机制 1. 为什么使用缓存? 当用户频繁查询某些固定的数据时,第一次将这些数据从数据库中查询出来,保存在缓存中.当用户再次查询这些数据时,不用再通过数据库查询,而是去缓存里面查 ...
- 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现
本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...
- 五、mybatis缓存机制
文章目录 五.缓存机制 一级缓存(默认开启) 二级缓存 注意 缓存顺序 mybatis基础教程[5小时36讲全套] 五.缓存机制 一级缓存(默认开启) 同一个sqlsession会话对象,执行同样 ...
- MyBatis缓存机制学习
与Hibernate一样,MyBatis 同样提供了一级缓存和二级缓存的支持. 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Sessi ...
- Mybatis缓存机制理解及配置
2019独角兽企业重金招聘Python工程师标准>>> 1. Ehcache EHCache是来自sourceforge(http://ehcache.sourceforge ...
最新文章
- archlinux安装TensorFlow带GPU
- 自然语言处理十问!独家福利
- 请求合并的三种方式,大大提高接口性能!
- formal method lecture 13
- 三十二、教你Python制作简单的二维码
- 思考一下消息中间件的设计
- Linux设备树相关
- 泰安技师学院计算机专业,泰安技师学院有哪些系部和专业
- 延时等待的gcode
- 图的深度优先遍历(DFS)
- 用C语言实现布丰投针计算圆周率问题
- Xmarks被GFW屏蔽后,怎么同步?
- 服务器IIS6/IIS7、Nginx、Apache屏蔽垃圾爬虫UA禁止垃圾爬虫,屏蔽指定UA
- java日志:一、JUL使用
- kafka+fluentd+heka了解资料
- 以网易云为例,使用审查元素(开发者选项)获取音乐资源
- 向量、矩阵、实数、复数之间的各种运算方法
- 网上书店eclipse---Java+SQL Server+swing
- html5新年动画祝福,canvas动画效果新年祝福话语
- Android 进阶之路(我的博客文章目录)
热门文章
- 小程序不同页面之间通讯的解决方案
- 如何使用fdisk与parted对不同容量硬盘分区
- PHP多种序列化/反序列化的方法 json_encode json_decode
- nginx反向代理和rewrite进行解决跨域问题、去掉url中的一部分字符串,通过nginx正则生成新的url...
- springMVC--(讲解5)文件上传与传参测试
- ToolStripStatusLabel设置时间自动更新
- Navicat Mac 快捷键有哪些
- crontab定时巡检使用
- 基于认证的代理平台搭建配置squid-20130730
- Terrarium 1.2