文章目录

  • 缓存介绍
  • 一级缓存
    • 二级缓存
      • 二级缓存使用步骤
    • 二级缓存和一级缓存的区别:

缓存介绍

缓存主要是对查询起作用,减轻数据库的压力,提高数据库的性能
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缓存机制相关推荐

  1. MyBatis复习笔记6:MyBatis缓存机制

    MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...

  2. 【转】MyBatis缓存机制

    转载:https://blog.csdn.net/bjweimengshu/article/details/79988252. 本文转载自公众号 美团技术点评 前言 MyBatis是常见的Java数据 ...

  3. MyBatis缓存机制之一级缓存

    MyBatis缓存机制之一级缓存 前言 MyBatis内部封装了JDBC,简化了加载驱动.创建连接.创建statement等繁杂的过程,是我们常见的持久性框架.缓存是在计算机内存中保存的临时数据,读取 ...

  4. [Professor麦]深入剖析Mybatis缓存机制

    哈哈哈,终于考完试了,用了大概两天时间肝了这篇文章!!! 关于今天要讲的mybatis缓存机制,其实之前我已经有看过也用过,只不过平常不太留意,最近在看mybatis源码,就来讲一下这个缓存机制 前言 ...

  5. 13.MyBatis缓存机制

    13.MyBatis缓存机制 1. 为什么使用缓存? 当用户频繁查询某些固定的数据时,第一次将这些数据从数据库中查询出来,保存在缓存中.当用户再次查询这些数据时,不用再通过数据库查询,而是去缓存里面查 ...

  6. 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

    本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...

  7. 五、mybatis缓存机制

    文章目录 五.缓存机制 一级缓存(默认开启) 二级缓存 注意 缓存顺序 mybatis基础教程[5小时36讲全套] 五.缓存机制 一级缓存(默认开启) ​ 同一个sqlsession会话对象,执行同样 ...

  8. MyBatis缓存机制学习

    与Hibernate一样,MyBatis 同样提供了一级缓存和二级缓存的支持. 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Sessi ...

  9. Mybatis缓存机制理解及配置

    2019独角兽企业重金招聘Python工程师标准>>> 1.     Ehcache EHCache是来自sourceforge(http://ehcache.sourceforge ...

最新文章

  1. archlinux安装TensorFlow带GPU
  2. 自然语言处理十问!独家福利
  3. 请求合并的三种方式,大大提高接口性能!
  4. formal method lecture 13
  5. 三十二、教你Python制作简单的二维码
  6. 思考一下消息中间件的设计
  7. Linux设备树相关
  8. 泰安技师学院计算机专业,泰安技师学院有哪些系部和专业
  9. 延时等待的gcode
  10. 图的深度优先遍历(DFS)
  11. 用C语言实现布丰投针计算圆周率问题
  12. Xmarks被GFW屏蔽后,怎么同步?
  13. 服务器IIS6/IIS7、Nginx、Apache屏蔽垃圾爬虫UA禁止垃圾爬虫,屏蔽指定UA
  14. java日志:一、JUL使用
  15. kafka+fluentd+heka了解资料
  16. 以网易云为例,使用审查元素(开发者选项)获取音乐资源
  17. 向量、矩阵、实数、复数之间的各种运算方法
  18. 网上书店eclipse---Java+SQL Server+swing
  19. html5新年动画祝福,canvas动画效果新年祝福话语
  20. Android 进阶之路(我的博客文章目录)

热门文章

  1. 小程序不同页面之间通讯的解决方案
  2. 如何使用fdisk与parted对不同容量硬盘分区
  3. PHP多种序列化/反序列化的方法 json_encode json_decode
  4. nginx反向代理和rewrite进行解决跨域问题、去掉url中的一部分字符串,通过nginx正则生成新的url...
  5. springMVC--(讲解5)文件上传与传参测试
  6. ToolStripStatusLabel设置时间自动更新
  7. Navicat Mac 快捷键有哪些
  8. crontab定时巡检使用
  9. 基于认证的代理平台搭建配置squid-20130730
  10. Terrarium 1.2