mybatis-缓存
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制,缓存可以极大的提升查询效率。MyBatis中默认定义了两级缓存,分别是一级缓存和二级缓存。
(1) 默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启。
(2)二级缓存需要手动配置,二级缓存是基于namespace级别的缓存。
(3)为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存。
一级缓存
1.一级缓存(local cache), 即本地缓存, 作用域默认为sqlSession,不需要实现Serializable。当 Session flush 或 close 后, 该Session 中的所有Cache 将被清空。
2.本地缓存不能被关闭, 但可以调用clearCache()来清空本地缓存, 或者改变缓存的作用域。
二级缓存
1.二级缓存的作用域是同一个namespace下的mapper映射文件内容,是SqlSessionFactory级别的,通过同一个SqlSessionFactory创建的SqlSession查询的结果是会被缓存的,此后如果再次执行相同的查询语句,结果就会从缓存中获取。二级缓存需要手动开启。
2.MyBatis提供二级缓存的接口以及实现,实现二级缓存要求被查询的JavaBean实现Serializable接口。
3.二级缓存在SqlSession 关闭或提交之后才会生效。
4.二级缓存是默认启用的(要生效需要对每个Mapper进行配置),如想取消,则可以通过Mybatis配置文件中的元素下的子元素来指定cacheEnabled为false。
cache元素定义会生成一个采用最近最少使用算法最多只能存储1024个元素的缓存,而且是可读写的缓存,即该缓存是全局共享的,任何一个线程在拿到缓存结果后对数据的修改都将影响其它线程获取的缓存结果,因为它们是共享的,同一个对象。
cache元素可指定如下属性,每种属性的指定都是针对都是针对底层Cache的一种装饰,采用的是装饰器的模式。
blocking:默认为false,当指定为true时将采用BlockingCache进行封装,blocking,阻塞的意思,使用BlockingCache会在查询缓存时锁住对应的Key,如果缓存命中了则会释放对应的锁,否则会在查询数据库以后再释放锁,这样可以阻止并发情况下多个线程同时查询数据,详情可参考BlockingCache的源码。
简单理解,也就是设置true时,在进行增删改之后的并发查询,只会有一条去数据库查询,而不会并发
eviction:eviction,驱逐的意思。也就是元素驱逐算法,默认是LRU,对应的就是LruCache,其默认只保存1024个Key,超出时按照最近最少使用算法进行驱逐,详情请参考LruCache的源码。如果想使用自己的算法,则可以将该值指定为自己的驱逐算法实现类,只需要自己的类实现Mybatis的Cache接口即可。除了LRU以外,系统还提供了FIFO(先进先出,对应FifoCache)、SOFT(采用软引用存储Value,便于垃圾回收,对应SoftCache)和WEAK(采用弱引用存储Value,便于垃圾回收,对应WeakCache)这三种策略。
flushInterval:清空缓存的时间间隔,单位是毫秒,默认是不会清空的。当指定了该值时会再用ScheduleCache包装一次,其会在每次对缓存进行操作时判断距离最近一次清空缓存的时间是否超过了flushInterval指定的时间,如果超出了,则清空当前的缓存,详情可参考ScheduleCache的实现。
readOnly:是否只读
true:只读缓存; 会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。
false:读写缓存; 会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false。
size:用来指定缓存中最多保存的Key的数量。其是针对LruCache而言的,LruCache默认只存储最多1024个Key,可通过该属性来改变默认值,当然,如果你通过eviction指定了自己的驱逐算法,同时自己的实现里面也有setSize方法,那么也可以通过cache的size属性给自定义的驱逐算法里面的size赋值。
type:type属性用来指定当前底层缓存实现类,默认是PerpetualCache,如果我们想使用自定义的Cache,则可以通过该属性来指定,对应的值是我们自定义的Cache的全路径名称。
二级缓存的使用原则
只能在一个命名空间下使用二级缓存
- 由于二级缓存中的数据是基于namespace的,即不同namespace中的数据互不干扰。在多个namespace中若均存在对同一个表的操作,那么这多个namespace中的数据可能就会出现不一致现象。
在单表上使用二级缓存
- 如果一个表与其它表有关联关系,那么久非常有可能存在多个namespace对同一数据的操作。而不同namespace中的数据互补干扰,所以就有可能出现多个namespace中的数据不一致现象。
查询多于修改时使用二级缓存
- 在查询操作远远多于增删改操作的情况下可以使用二级缓存。因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新将降低系统性能。
Mybatis缓存查询的顺序
先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。 如果二级缓存没有命中,再查询一级缓存
如果一级缓存也没有命中,则查询数据库
SqlSession关闭之后,一级缓存中的数据会写入二级缓存
我们可以使用其他技术来代替mybatis的二级缓存,但是不能代替一级缓存
mybatis-缓存相关推荐
- MyBatis复习笔记6:MyBatis缓存机制
MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...
- 实际测试例子+源码分析的方式解剖MyBatis缓存的概念
前言: 前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:79 ...
- Mybatis 缓存系统源码解析
Mybatis 缓存系统源码解析 转载于:https://juejin.im/post/5bfa50905188251d0920006c
- MyBatis学习总结(七)——Mybatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- MyBatis(三)MyBatis缓存和工作原理
MyBatis缓存 MyBatis提供了一级缓存和二级缓存,并且预留了集成第三方缓存的接口. 从上面MyBatis的包结构可以很容易看出跟缓存相关的类都在cache的package里,其底层是一个Ca ...
- 后端:MyBatis缓存知识介绍
今天给大家分享一下MyBatis缓存知识介绍,希望对大家日常的开发当中能有所帮助! 一.MyBatis一级缓存 1.一级缓存介绍 当我们的程序MyBatis开启一次和数据库的会话,MyBatis会自动 ...
- MyBatis缓存通俗易懂
1.1 mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的 ...
- 缓存在哪里_什么是MyBatis缓存技术
MyBatis缓存 引言 在一个Web项目中,查询数据库中的操作算是一个非常常用的操作,但是有些数据会被经常性的查询,而每一次都去数据库中查询这些重复的数据,会很消耗数据库的资源,同时使得查询效率也很 ...
- mybatis缓存二级缓存_MyBatis缓存与Apache Ignite的陷阱
mybatis缓存二级缓存 一周前,MyBatis和Apache ignite 宣布支持apache ignite作为MyBatis缓存(L2缓存). 从技术上讲,MyBatis支持两个级别的缓存: ...
- MyBatis缓存与Apache Ignite的陷阱
一周前,MyBatis和Apache ignite 宣布支持apache ignite作为MyBatis缓存(L2缓存). 从技术上讲,MyBatis支持两个级别的缓存: 本地缓存,默认情况下始终启用 ...
最新文章
- javascript 实现模拟滚动条,但不支持鼠标滚轮
- iis7 上传限制问题
- SAE下的Memcache使用方法
- 咱也开始玩z-blog了
- ciaodvd数据集的简单介绍_人工智能进阶-CIFAR-10数据集介绍
- 和vs版本关系_教学鉴定贴:如何判断是不是VS厂的沛纳海手表
- [洪流学堂]Unity2017.3新功能:程序集定义(Assembly Definition File)功能详解
- CRF++总结 (1)(2)【转】
- 知乎万赞回答:什么工具能做可视化大屏,还能做数据地图?
- 程序员容易的疾病之干眼症(治疗篇)
- css3学习之文字展示多余的用三个点显示
- java安装_Java编程语言的历史和未来
- dota2游戏心得
- [内附完整源码和文档] 基于C#和SQL Server 2008的自助点餐系统设计与实现
- python hdf5_安装HDF5 1.8 和H5PY--HDF5和python接口
- 如何优雅的在 Word 中插入代码,PlanetB 的完美替代方案
- win7电脑蓝屏代码0x00000034
- LeetCode 0592. 分数加减运算:手把手分步のC++讲解
- 英语四六级作文和翻译
- 小程序商城怎么开?开发商城小程序流程步骤介绍