一级缓存:

mybatis默认开启一级sqlsession缓存,sqlsession指的是一次会话,就是通过数据库连接池获取连接,然后在不关闭本次连接的情况下进行增删改 称为一次会话。sqlsession内部由好几部分组成,比如Executor(好几种,cacheExecutor,selectExecutor,updateExcutro等等...)是用来执行增删改的,如果开启了1级缓存,他在连接数据库前会先执行本地缓存获取,每个sqlsession都有自己的缓存!

首先在本次会话中查询出的语句会被缓存到localCache里,这里我像理解IOC那样把他理解成一个容器,sqlsession通过 statementId 、 rowBounds 、传递给JDBC的SQL 和 rowBounds.limit (统称 select statment)等条件来计算出一个哈希值一样的结果,然后根据结果当做key去容器中判断是否有该缓存数据,有的话就直接从容器中拿省去了查询数据库的操作。

通过源码可以知道Executor内部确实有计算哈希值,存取缓存数据的代码,关于select的Executor会执行存取操作,所有增删改的操作又会清除本地缓存,会话关闭时也会清除本地缓存。

由此一级缓存问题也很明显,在一次sqlsession多次执行select的情况不多,所以出现读脏数据的情况也是很少......连接一中断又会清除本地缓存,个人感觉使用很鸡肋,没什么太大意义。

大佬的总结:

  1. Mybatis一级缓存的生命周期和SqlSession一致。
  2. Mybatis的缓存是一个粗粒度的缓存,没有更新缓存和缓存过期的概念,同时只是使用了默认的hashmap,也没有做容量上的限定。
  3. Mybatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,有操作数据库写的话,会引起脏数据,建议是把一级缓存的默认级别设定为Statement,即不使用一级缓存。

二级缓存:

二级取消了sqlsession独立的缓存,取代之的是根据namespace来创建的多个缓存容器,也就是说不管多少个sqlsession,只要执行mapper的namespace一样会使用同一个容器,默认不开启,需要在myabtis的配置处开启,并且在mapper里的xml文件里配置好缓存策略,由于二级缓存是每一个namespace一个容器,所以连表查询时无法使用,需要在mapper里通过Cache ref标签关联另外一个namespace,否则无法感应出其他表数据的变化导致读脏数据。

和一级缓存一样查询不会刷新缓存,增删改会刷新缓存数据。

个人感觉如果配置不当很容易发生脏数据读取,实际中多表联查较多的时候就会很容易少配置某个表导致出现脏数据,使用的好的话确实可以起到很好的本地缓存,但是相对于cachche比较麻烦容易出错,使用起来还是有些鸡肋,个人推荐使用cachche做本地缓存。

大佬的总结:

  1. Mybatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到Mapper级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。
  2. Mybatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用的条件比较苛刻。
  3. 在分布式环境下,由于默认的Mybatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将Mybatis的Cache接口实现,有一定的开发成本,不如直接用Redis,Memcache实现业务上的缓存就好了。

大佬的文章:https://www.jianshu.com/p/c553169c5921

Mybatis缓存的使用和注意事项相关推荐

  1. java day56【 Mybatis 延迟加载策略 、 Mybatis 缓存、Mybatis 注解开发 】

    第1章 Mybatis 延迟加载策略 1.1 何为延迟加载? 1.2 实现需求 1.3 使用 assocation 实现延迟加载 1.3.1 账户的持久层 DAO 接口 1.3.2 账户的持久层映射文 ...

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

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

  3. 实际测试例子+源码分析的方式解剖MyBatis缓存的概念

    前言: 前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:79 ...

  4. Mybatis 缓存系统源码解析

    Mybatis 缓存系统源码解析 转载于:https://juejin.im/post/5bfa50905188251d0920006c

  5. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  6. MyBatis(三)MyBatis缓存和工作原理

    MyBatis缓存 MyBatis提供了一级缓存和二级缓存,并且预留了集成第三方缓存的接口. 从上面MyBatis的包结构可以很容易看出跟缓存相关的类都在cache的package里,其底层是一个Ca ...

  7. 后端:MyBatis缓存知识介绍

    今天给大家分享一下MyBatis缓存知识介绍,希望对大家日常的开发当中能有所帮助! 一.MyBatis一级缓存 1.一级缓存介绍 当我们的程序MyBatis开启一次和数据库的会话,MyBatis会自动 ...

  8. MyBatis缓存通俗易懂

    1.1     mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的 ...

  9. 缓存在哪里_什么是MyBatis缓存技术

    MyBatis缓存 引言 在一个Web项目中,查询数据库中的操作算是一个非常常用的操作,但是有些数据会被经常性的查询,而每一次都去数据库中查询这些重复的数据,会很消耗数据库的资源,同时使得查询效率也很 ...

  10. mybatis缓存二级缓存_MyBatis缓存与Apache Ignite的陷阱

    mybatis缓存二级缓存 一周前,MyBatis和Apache ignite 宣布支持apache ignite作为MyBatis缓存(L2缓存). 从技术上讲,MyBatis支持两个级别的缓存: ...

最新文章

  1. SPSS(|PASW)18 学习笔记(1):入门示例-克山病例
  2. python爬虫入门教程-Python爬虫入门教程——爬取自己的博客园博客
  3. JVM基础(6)-常用参数总结
  4. 操作系统进程学习(Linux 内核学习笔记)
  5. jq之$(“p:first“)
  6. 50+企业数字化转型、管理的方法论,这本书到底有什么干货?
  7. Kali Linux 无线渗透测试入门指南 第一章 配置无线环境
  8. 跟随进度而变色进度条效果ios源码
  9. Servlet destroy()回收机制
  10. codeforces 984 A. Game
  11. 如何用AE做出动画效果杭州UI设计分享方法
  12. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(一)之效果展示与关键技术简介
  13. 17.敏捷项目管理流程实例 - 整体流程框架
  14. 1. HikariCP连接池优化配置小结
  15. 隐马尔可夫模型简单介绍
  16. 测试用例设计之错误推测法
  17. 基于华为云服务器Docker nginx安装和配置挂载
  18. K8s 多节点部署流程
  19. 图匹配(Graph Matching)入门学习笔记——以《Factorized Graph Matching》为例(一)
  20. 【CSS Selector】小猪网短租房(Python R)

热门文章

  1. 易实战Spring Boot 2 资源汇总 从入门到精通 内含实战github代码 毫无保留分享
  2. html与css怎么混合运用,Web设计中的CSS混合模式
  3. Adam自适应矩估计
  4. 象棋将帅不能碰面 java_为何象棋有“将帅不能碰面”的规则?原来这有一个不为人知的典故...
  5. nginx 带宽_你知道服务器的带宽怎样设置吗?
  6. CS231n李飞飞计算机视觉 卷积神经网络详解上
  7. Scala入门(2)
  8. c语言邻接表存储拓扑排序,拓扑排序(完整案列及C语言完整代码实现)
  9. SSM通信研究:如何拦截SSM代理流量
  10. 70.爬楼梯 (力扣leetcode) 博主可答疑该问题