转载自https://blog.csdn.net/yin767833376/article/details/80537695

一级缓存

MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的。即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。

​ 但是不同的SqlSession对象,因为不同的SqlSession都是相互隔离的,所以相同的Mapper、参数和方法,他还是会再次发送到SQL到数据库去执行,返回结果。

二级缓存

二级缓存是mapper级别的缓存,它的实现机制跟一级缓存差不多,也是基于PerpetualCache的HashMap本地存储。作用域为mapper的namespace,可以自定义存储,比如Ehcache。Mybatis的二级缓存是跨Session的,每个Mapper享有同一个二级缓存域.

Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的Java对象。

二级缓存是需要配置来开启的:

<setting name="cacheEnabled" value="true"/>
  • 1

非常简单,在Mybatis的核心配置文件中加上上面这行代码,然后在Mapper映射文件中添加一行:

<cache eviction="FIFO"  flushInterval="60000"  size="512"  readOnly="true"/>
  • 1

表示开启二级缓存,flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。 size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。 readOnly(只读)属性可以被设置为true或false。 
只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。

如果已经开启二级缓存的mapper里面某个查询不需要缓存,可以使用useCache=”false”禁用二级缓存:

<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" useCache="false">

刷新缓存:

在mapper的同一个namespace中,如果有其他insert、update、delete操作后都需要执行刷新缓存操作,来避免脏读。

这时我们只需要设置statement配置中的flushCache=“true“属性,就会默认刷新缓存,相反如果是false就不会了。 
当然,不管开不开缓存刷新功能,你要是手动更改数据库表,那都肯定不能避免脏读的发生,那就属于手贱了。

无论是一级缓存还是二级缓存,C/U/D增删改操作commit提交后会清空缓存区域,使缓存失效。合理利用二级缓存可以提高系统性能,减少数据库压力。但是,如果使用不当可那个会出现缓存一致性问题,对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度。

mybatis在一个事物中获取oracle中的sequence,一开始没有问题,每次都返回不同的值,运行几天之后,批量处理三条数据,返回的是同一个sequence;

mybatis  xml文件中的sql如下:

以下四种解决方法,本人用的第二种:

1.拿出@Transactional,就不会出错。

2.加上useCache="false" flushCache="true",不保存在二级缓存中,并清空缓存

3.mybatis.configuration.localCacheScope=STATEMENT,修改一级缓存的作用域

4.mybatis.configuration.cacheEnabled = false,禁用一级和二级缓存

mybatis在一个事物中获取oracle中的sequence,一开始没有问题,每次都返回不同的值,运行几天之后,批量处理三条数据,返回的是同一个sequence;

mybatis 缓存总结以及遇到的问题相关推荐

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

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

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

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

  3. Mybatis 缓存系统源码解析

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

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

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

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

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

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

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

  7. MyBatis缓存通俗易懂

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

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

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

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

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

  10. MyBatis缓存与Apache Ignite的陷阱

    一周前,MyBatis和Apache ignite 宣布支持apache ignite作为MyBatis缓存(L2缓存). 从技术上讲,MyBatis支持两个级别的缓存: 本地缓存,默认情况下始终启用 ...

最新文章

  1. python有用吗-python有用么
  2. 云视通手机录像存储在什么地方_抖音影视剪辑抽帧是什么意思
  3. Lesson 16.4 卷积遇见深度学习
  4. 2017/3/10 morning
  5. C++ 四种类型转换
  6. 统计字符串中出现最多的单词和次多的单词
  7. 大数据 -- Spark
  8. android7开发问题,Android开发问题总结(一)
  9. js中删除数组中某一项的方法
  10. 讲真,灾备的内涵其实很丰富
  11. 监控mysql连接池信息_druid-带监控功能的数据库连接池
  12. 算法:两个数之和为目标数Two Sum II - Input array is sorted
  13. 下载IDEA - 2020.1以及安装IntelliJ IDEA
  14. 软件质量属性:易用性
  15. 为什么高斯滤波器被广泛用于图像处理?
  16. 在线流程图和思维导图开发技术详解(一)
  17. MySQL8的URL和Driver的写法
  18. Apollo - 阿波罗配置中心使用,一文搞定!
  19. 2022-2028年全球与中国智能纺织品产业市场前瞻与投资战略规划分析
  20. 打开matlab只出现蓝色的界面,win10 windows设置无法打开总卡在纯蓝色界面如何解决...

热门文章

  1. PTA-习题11-2 查找星期 (15 分)-enum
  2. gh0st源码分析与远控的编写(三)
  3. VC使用flash简易教程
  4. WebRTC Audio 接收和发送的关键过程
  5. 第43讲:灵活好用的 Spider 的用法
  6. DevOps工程师到底是做什么的?
  7. 无人值守的自动 dump(一)
  8. 视频压缩标准简史:从1929到2020
  9. 【直播预告 | 今天10:30】多媒体技术 PI 第一期:OSS圆桌
  10. 当SRS遇到K8s:如何构建海量推流源站?