简介

  Mybatis一级缓存是会话级的缓存,而二级缓存则是应用级别的缓存,默认关闭,二级缓存使用不慎可能会导致脏读。

开启方式(SpringBoot+Mybatis)

  application.properties添加配置

mybatis.configuration.cache-enabled=true

  在mapper的xml文件中的namespace中加上

<cache></cache>

  为了方便看到效果 ,application.properties设置日志级别为debug

logging.com.qs.birp.dao=debug
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

  先测试调用一次SQL ,再次调用时可以缓存命中。

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3563659a] was not registered for synchronization because synchronization is not active
Cache Hit Ratio [com.qs.birp.dao.EquTAufkDao]: 0.3333333333333333
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3563659a]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d18d986] was not registered for synchronization because synchronization is not active
Cache Hit Ratio [com.qs.birp.dao.EquTAufkDao]: 0.5
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d18d986]

命中条件

  和一级缓存不同,二级缓存在事务提交和会话关闭后才会写入(在会话和二级缓存间会有一个事务缓存管理器TransactionalCacheManager,会话期间查询的数据会放到管理器的暂存区TransactionalCache,当事务提交后才会写入到指定的二级缓存区域),当执行数据库update操作时会清空该namespace下的缓存。

  1. 相同的statement id
  2. 相同的Sql与参数
  3. 查询结果分页条件相同
  4. 没有使用ResultHandler来自定义返回数据
  5. 没有配置UseCache=false 来关闭指定查询的缓存
  6. 没有配置FlushCache=true 来清空缓存
  7. 在调用存储过程中不能使用出参,即Parameter中mode=out|inout

源码解析

  源码位置:org.apache.ibatis.executor.CachingExecutor.java 这里面比较关键的代码是List list = (List) tcm.getObject(cache, key);

  @Overridepublic <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) {flushCacheIfRequired(ms);if (ms.isUseCache() && resultHandler == null) {ensureNoOutParams(ms, boundSql);@SuppressWarnings("unchecked")List<E> list = (List<E>) tcm.getObject(cache, key);if (list == null) {list = delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);tcm.putObject(cache, key, list); // issue #578 and #116}return list;}}return delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);}

  Mybatis源码里面二级缓存使用装饰器的设计模式,装饰器在org.apache.ibatis.cache.decorators包下面。

  SynchronizedCache 同步锁,用于保证对指定缓存区的操作都是同步的
  LoggingCache 统计器,记录缓存命中率
  BlockingCache 阻塞器,基于key加锁,防止缓存穿透
  ScheduledCache 时效检查,用于验证缓存有效器,并清除无效数据
  LruCache 溢出算法,最近最少使用算法,淘汰闲置最久的缓存。
  FifoCache 溢出算法,淘汰加入时间最久的缓存
  WeakCache 溢出算法,基于java弱引用规则淘汰缓存
  SoftCache 溢出算法,基于java软引用规则淘汰缓存
  PerpetualCache 实际存储,内部采用HashMap进行存储。

注意事项

  1. 只能在【只有单表操作】的表上使用缓存
    不只是要保证这个表在整个系统中只有单表操作,而且和该表有关的全部操作必须全部在一个namespace下。
  2. 在可以保证查询远远大于insert,update,delete操作的情况下使用缓存

Mybatis源码学习笔记之Mybatis二级缓存相关推荐

  1. MyBatis源码学习笔记(从设计模式看源码)

    文章目录 1.源码分析概述 ①.Mybatis架构分析 ②.门面模式 ③.设计模式的原则 2.日志模块分析 ①.适配器模型 ②.动态代理 ③.日志模块分析 3.数据源模块分析 ①.工厂模式 ②.数据源 ...

  2. Mybatis源码学习笔记

    Mybatis核心概念: Configuration : 管理 mysql-config.xml 全局配置关系类 SqlSessionFactory: Session 管理工厂接口 Session:  ...

  3. 【博学谷学习记录】超强总结,用心分享 | 架构师 Mybatis源码学习总结

    Mybatis源码学习 文章目录 Mybatis源码学习 一.Mybatis架构设计 二.源码剖析 1.如何解析的全局配置文件 解析配置文件源码流程 2.如何解析的映射配置文件 Select inse ...

  4. 【Mybatis源码学习】概述

    [Mybatis源码学习]概述 1.怎样下载源码 1.1 下载地址 1.2 导入Idea 1.2.1 环境 1.2.2 部署与打包 2.源码架构 2.1 核心流程三大阶段 2.1.1 初始化 2.1. ...

  5. Mybatis源码学习-动态代理

    Mybatis源码学习-动态代理 binding包下面是mybatis的mapper动态代理 // Mybatis官方手册建议通过mapper对象访问mybatis,因为使用mapper看起来更优雅 ...

  6. Mybatis源码学习(三)SqlSession详解

    前言 上一章节我们学习了SqlSessionFactory的源码,SqlSessionFactory中的方法都是围绕着SqlSession来的.,那么SqlSession又是什么东东呢?这一章节我们就 ...

  7. Mybatis源码分析第一天------Mybatis实用篇

    Mybatis源码分析第一天------Mybatis实用篇 一切最基本的操作就是参考官方文档:https://mybatis.org/mybatis-3/zh/configuration.html ...

  8. mybatis源码阅读(三):mybatis初始化(下)mapper解析

    转载自 mybatis源码阅读(三):mybatis初始化(下)mapper解析 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单. ...

  9. mybatis源码阅读(二):mybatis初始化上

    转载自  mybatis源码阅读(二):mybatis初始化上 1.初始化入口 //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与 ...

最新文章

  1. WebBrowser内存泄露
  2. vue -- 动态加载组件 (tap 栏效果)
  3. 海量数据中,寻找最小的k个数。
  4. 从程序员到项目经理(五):程序员加油站 -- 不是人人都懂的学习要点
  5. 集群起不来oracle,Oracle11g rac 集群无法启动分析及处理
  6. 【Pre-Training】XLNet:预训练最强,舍我其谁
  7. MySQL的约束、事务、字符串、日期、数学相关及其他补充
  8. 关于ibatis中sqlMap配置文件中使用到,的处理
  9. python函数定义和调用练习_python函数的定义和调用
  10. 极大似然估计(Maximum likelihood estimation)
  11. 爱心函数可视化 python
  12. namecheap,namesilo域名注册优势,国外域名注册,2018 namesilo注册优惠码
  13. 巨杉数据库全新认证机制来袭!首期考试时间公布
  14. 开发公众号授权遇到的redirect_uri参数错误
  15. 开源、强大的Linux服务器集群管理工具,比宝塔好用!
  16. 计算机学习(四)基本电路原理——实现反相控制
  17. SCORM 基础知识
  18. Mac Parallels Desktop 安装 Centos 虚拟机
  19. 《读者》2005言论
  20. 【JQ _DOM】DOM

热门文章

  1. 流量矩阵常见的两种估计方法对比
  2. 什么是CDN资质?什么情况需要办CDN牌照
  3. 计算机开始菜的mstsc命令,Win10一周年更新版系统CLSID(GUID)汇总
  4. Matebook xpro2019指纹驱动不可用
  5. 宇宙的本源—存在之道和变化之道
  6. 我们应该拥有怎样的职场价值观
  7. 第二证券|扶持政策频发,教育板块再度爆发,全通教育“20cm”涨停
  8. 对输入的两个分数选择‘+’、‘-’、‘*’、‘/’四则运算,并以分数形式输出结果。输入:第一行先输入整数T,表示总共有T组数据。接下来共T行,每行输入分数形式的算术表达式。 输出:最简分数形
  9. 蓝桥杯基础练习python
  10. 2021年深圳盐田区绿色建筑与装配式建筑发展资金申报资助及条件,补贴200万