-
2019-10-09 14:18:53
缓存
什么是缓存 存储在运行内存中的数据 -- 缓存数据 计算机的存储方式效率不高,因此会将一些数据放在内存中 - 数据的清空机制 - 数据的复用机制 为什么要用缓存 部分数据不要求实时性,并且使用频率较高,可以将此数据缓存到内存中
一级缓存
事务缓存 sqlsession mybatis默认开启了一级缓存 在同一个事务中,默认将sql查询结果进行缓存,如果之后还需要执行相同的sql语句,默认不会再次查询 如果保存查询结果之后,进行了相关表的更新操作(添加,删除,修改),清空之前保存的数据
二级缓存
应用级缓存 同一个configuration对象中有效 缓存所有的查询结果,更新操作会刷新缓存结果
实现步骤
1、开启mybatis二级缓存,需要在configuration配置文件中进行配置 <settings> <!-- 开启二级缓存 默认值为true --> <setting name="cacheEnabled" value="true"/> </settings> 2、需要保存的对象都必须实现序列化接口 Serializable 3、需要mapper配置文件中进行缓存设置 eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。 (1) LRU,最近最少使用的,一处最长时间不用的对象 (2) FIFO,先进先出,按对象进入缓存的顺序来移除他们 (3) SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象 (4) WEAK,弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。这里采用的是LRU, 移除最长时间不用的对形象 flushInterval:刷新间隔时间,单位为毫秒,这里配置的是100秒刷新,如果你不配置它,那么当 SQL被执行的时候才会去刷新缓存。 size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。 这里配置的是1024个对象 readOnly:只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有 办法修改缓存,他的默认值是false,不允许我们修改 <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"/>
三级缓存
一般会采用NoSQL数据库进行缓存操作 将查询结果存储到NoSQL数据库 - 散列算法(目前查询效率最高的算法) Redis
更多相关内容 -
MyBatis 二级缓存 关联刷新实现
2021-01-20 02:19:46Mybatis提供对缓存的支持,但是在没有配置的默认情况下,它只开启一级缓存,二级缓存需要手动开启。 一级缓存只是相对于同一个SqlSession而言。也就是针对于同一事务,多次执行同一Mapper的相同查询方法,第一... -
mybatis二级缓存配置
2019-03-07 11:03:59对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。实现方法如下:通过设置刷新间隔...一、应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
二、开启二级缓存
mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的全局总开关,还要在具体的mapper.xml中启用二级缓存。
开启全局总开关:
在mapper.xml中启用二级缓存:
mybatis默认方式
与第三方分布式缓存框架(如redis、memcached和ehcache)集成方式
注意:
二级缓存需要将查询结果映射到POJO对象时,POJO对象需要实现java.io.Serializable接口,进行序列化和反序列化操作。如果存在父类、成员POJO都需要实现序列化接口。
三、禁用二级缓存和刷新缓存
例子:
1、useCache配置禁用二级缓存:
在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。
场景:针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存。
2、设置statement配置中的flushCache=true 属性,可刷新缓存。
四、Mybatis Cache参数
flushInterval(刷新间隔)可以被设置为任意的正整数,而且它代表一个合理的毫秒形式的时间段。默认情况是不设置,即没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目)可被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
如下例子:
<cache eviction='FIFO' flushInterval='60000' size='512' readOnly='true'/>
这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。可用的收回策略有, 默认的是 LRU:
1. LRU – 最近最少使用的:移除最长时间不被使用的对象。
2. FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
3. SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
4. WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
五、参考资料
《深入理解mybatis原理》 MyBatis的二级缓存的设计原理 :
http://blog.csdn.net/luanlouis/article/details/41408341
-
Mybatis二级缓存失效及二级缓存使用简介
2021-08-01 14:23:281.Mybatis二级缓存使用简介: 1.1:开启全局二级缓存配置:<setting name="cacheEnabled" value="true"></setting> 1.2:在对应的xxxmapper.xml文件加入<cache/>标签 注意:二级缓存是基于...1.Mybatis二级缓存使用简介:
1.1:开启全局二级缓存配置:<setting name="cacheEnabled" value="true"></setting>
1.2:在对应的xxxmapper.xml文件加入<cache/>标签
注意:二级缓存是基于命名空间namespace的,一级缓存是基于sqlSession的,也就是与数据库之间的一次会话。
1.2.1:cache的相关属性介绍:
eviction: 缓存的回收策略
LRU(默认):最近最少使用,移除最长时间不被使用的对象
FIFO:先进先出,安对象进入缓存的顺序来移除它们
SOFT:软引用,移除基于垃圾回收器的状态和软引用规则的对象
WEAK: 弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象
flushInterval:缓存刷新间隔 缓存多长时间清空一次,默认不清空,设置一个毫秒值
readOnly:是否只读 。
true:只读,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。 mybatis为了加快获取速度,直接会将数据在缓存中的引用交给用户,不 安全,但速度快。
false:非只读,mybatis觉得获取的数据可能会被修改 mybatis会利用序列化&反序列化的技术克隆一份新的数据给你,安全,但速度慢。
size:缓存最多存放多少个引用。
type:指定自定义缓存的全类名,实现Mybatis提供的Cache接口即可。
1.3:因为上面说到mybatis会用到序列化&反序列化技术克隆一份新的数据,所以对应的pojo需要实现序列化
2.mybatis二级缓存失效的原因
2.1:下面这篇博客个人觉得已经总结的很全面了,传送门:
转载:https://www.cnblogs.com/DoubleEggs/p/6243223.html
2.2:补充一个比较简单但有时候比较容易忽略的场景(亲身经历):
自己写了一个工具类,来获取sqlSession,但是每次获取sqlSession的时候,都会重新加载mybatis全局配置文件,创建一个新的sqlSessionFactory,sqlSessionFactory不同自然也会导致二级缓存失效:
-
Springboot项目配置Mybatis二级缓存
2020-08-12 18:34:57什么是缓存? 简单来讲,缓存就是存储在缓冲区里的内容,或者可以理解为...Mybatis的缓存分为一级缓存和二级缓存。一级缓存是默认开启的,二级缓存需要手动开启。 一级缓存是SqlSession级别的缓存,作用域是一个SqlSess什么是缓存?
简单来讲,缓存就是存储在缓冲区里的内容,或者可以理解为存在内存中的内容。用户可以将经常查询的内容放到缓存中,再次使用时直接从缓存中取值,而不需要再查询数据库。这样做的优点是响应迅速,减少了系统资源(网络资源、CPU资源等)开销;缺点是需要占用内存资源,服务器一旦关机,缓存就会丢失,重启后需要重新将写一遍数据到内存。
Mybatis的缓存
Mybatis的缓存分为一级缓存和二级缓存。一级缓存是默认开启的,二级缓存需要手动开启。一级缓存是SqlSession级别的缓存,作用域是一个SqlSession。在同一个SqlSession中,执行相同的查询sql,第一次会先去查询数据库,并写入缓存。第二次再执行时,则直接从缓存中取数据。如果两次执行查询sql的中间执行了增删改操作,则会清空该SqlSession的缓存。
二级缓存是mapper级别的缓存。作用域是是mapper的同一个namespace下的sql语句。第一次执行查询SQL时,会将查询结果存到二级缓存区域内。第二次执行相同的查询SQL,则直接从缓存中取出数据。如果两次执行查询sql的中间执行了增删改操作,则会清空该namespace下的二级缓存。
1、开启二级缓存
(1) 修改resources目录下的application.properties配置文件,加入开启mybatis二级缓存的配置和打印执行sql的配置
# 开启mybatis的二级缓存 mybatis.configuration.cache-enabled=true # 开启sql打印 logging.level.com.batis.mapper=debug
(2) 修改resources目录下mapping目录对应的Mapper文件
<!-- 开启二级缓存 --> <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"> </cache>
说明:
eviction: 回收策略
LRU 最近最少使用的,移除最长时间不被使用的对象,这是默认值
FIFO 先进先出,按对象进入缓存的顺序来移除它们
SOFT 软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK 弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象flushInterval: 刷新间隔,以毫秒为单位,100000表示每100秒刷新一次缓存。不设置的话,则每次调用语句时刷新。
readOnly: 只读属性可以被设置为true后者false。只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,这提供了很重要的性能优势。可读写的缓存会通过序列化返回缓存对象的拷贝,这种方式会慢一些,但很安全,因此默认为false。
size: 可以被设置为任意的正整数,要记住缓存的对象数目和运行环境的可用内存资源数目,默认1024。
(3) 实体对象要implements Serializable,否则报错
public class User implements Serializable{ }
(4) 启动工程,如果出现
Cache Hit Ratio . #表示缓存开启了.....
2、启动batis项目并使用postman工具进行测试
查询用户:
打印sql日志,可以看到详细的查询过程(红框),第一次查询时调用了查询语句,后面绿框中的是多次查询,没有调用查询语句,而是直接取缓存的值;100秒之后再进行第二次查询,又重新调用了查询语句,并且多次查询后是从缓存取出值。:
插入用户并执行查询:
从上图的执行结果可以看到,先进行查询操作,查询结果更新到缓存,后面的几次查询都是直接从缓存取值。之后执行一个插入用户的操作,再多次执行查询操作的时候,会先调用一次查询语句将查询结果写入缓存,后面的几次操作就会直接从缓存取值。
至此Springboot集成Mybatis的二级缓存内容已经全部讲完,测试也都完全符合预期!
有可以改进的地方希望诸位同学不要吝惜笔墨,加以指正,万分感谢!参考文章链接:https://blog.csdn.net/huanongying123/article/details/104293908
-
mybatis二级缓存(侧重于springboot整合mybatis)
2022-03-02 10:30:00--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> -
MyBatis 二级缓存的开启与配置
2020-08-07 22:53:12与大多数持久层框架一样,MyBatis也提供了缓存机制,通过缓存机制...1、首先在mybatis配置文件的节点中配置整体开启二级缓存。 <settings> <!-- 开启日志 --> <setting name="logImpl" value="STDOU. -
详解MyBatis二级缓存及工作流程
2021-12-24 17:28:38文章目录系列文章目录前言二、mybatis二级缓存:出现的原因:二级缓存介绍:二级缓存清除策略:事务管理策略:二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工... -
mybatis二级缓存参数
2020-11-19 18:29:07eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。 (1) LRU,最近最少使用的,一处最长时间不用的对象 (2) FIFO,先进先出,按对象进入缓存的顺序来移除他们 (3) SOFT,软引用,移除基于垃圾回收器状态和软... -
Mybatis二级缓存
2021-01-16 00:21:13Mybatis的查询缓存总共有两级,我们称之为一级缓存和二级缓存,如图:一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的... -
深入理解MyBatis中的一级缓存与二级缓存
2020-08-30 04:26:37主要给大家深入的介绍了关于MyBatis中一级缓存与二级缓存的相关资料,文中详细介绍MyBatis中一级缓存与二级缓存的工作原理及使用,对大家具有一定的参考性学习价值,需要的朋友们下面来一起看看吧。 -
MyBatis 二级缓存全详解
2021-01-27 09:19:00我们在上一篇文章 ( https://mp.weixin.qq.com/s/4Puee_pPCNArkgnFaYlIjg ) 介绍了 MyBatis 的一级缓存的...MyBatis 二级缓存介绍上一篇文章中我们介绍到了 MyBatis 一级缓存其实就是 SqlSession 级别的缓存,什么... -
Redis开启mybatis二级缓存(Springboot)
2022-01-15 12:19:121.缓存的概念(cache) cache缓存是高速缓冲寄存器,解决频繁操作(访问)数据的问题。 两个应用软件或者是硬件之间...#开启mybatis的二级缓存,application.properties文件中添加 mybatis.configuration.cache-enab -
面试总结:mybatis开启二级缓存的配置
2021-10-27 22:07:11第一步:在mybatis的全局配置文件中配置Setting属性,设置名为 cacheEnabled 的属性值为 true 即可。...在具体需要二级缓存的mapeer映射文件中开启二级缓存,值需要在相应的映射文件中添加一个cache标签即可 ... -
mybatis plus使用redis作为二级缓存的方法
2020-08-25 15:45:14主要介绍了mybatis plus使用redis作为二级缓存的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 -
MyBatis一级缓存和二级缓存
2022-03-12 17:20:16第二次以后则直接去一级缓存中取。 当执行的SQL查询中间发生了增删改的操作,mybatis会把SqlSession的缓存清空。 一级缓存失效的情况 SqlSession不同; SqlSession相同,查询条件不同。因为缓存条件不同,缓存中还... -
mybatis 一级缓存和二级缓存
2022-04-05 22:13:22配置mybatis maven: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> &... -
mybatis二级缓存
2021-12-18 09:45:19一、使用echache作为二级缓存 1.导入echache相关依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>... -
mybatis二级缓存架构原理
2022-03-14 16:06:05一级缓存 与springboot集成时一级缓存不生效原因以及解决方案 如何解决这个问题? 要知道如何解决这个问题, ...二级缓存 ...为什么mybatis默认不开启二级缓存? 不推荐使用。 ... -
springboot 配置mybatis的二级缓存机制,使用redis配置二级缓存demo代码
2021-08-25 16:45:13springboot 配置mybatis的二级缓存机制 一级缓存 是sqlSession级别的缓存,面向单个访问用户 二级缓存 是namespace级别的缓存,同一个namespace内查询会缓存,一旦发生增删改操作则会清空该namespace缓存,二级缓存... -
mybatis二级缓存详解
2021-01-13 10:31:41一、创建Cache的完整过程 我们从SqlSessionFactoryBuilder解析mybatis-config.xml配置文件开始: Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); S... -
Mybatis-plus基于redis实现二级缓存过程解析
2020-08-18 16:10:39主要介绍了Mybatis-plus基于redis实现二级缓存过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
MyBatis二级缓存
2021-06-28 11:39:14Myabtis包含一级缓存及二级缓存,一级缓存是基于SqlSession的(SqlSession间隔离)而二级...4.debug查看Mybatis源码了解Mybatis二级缓存底层数据结构(HashMap)及工作模式 本文只涉及二级缓存,更多了解一级缓存.. -
MyBatis缓存专题-一文彻底搞懂MyBatis二级缓存
2021-08-07 12:46:47配置二级缓存2.2.分开关2.3.实体类实现序列化接口2.4.测试方法3.cache有一些可选的属性3.1.type3.2.eviction3.3.flushInterval3.4.size3.5 readOnly3.6 blocking4.MyBatis的缓存机制整体设计以及二级缓存的工作模式5... -
mybatis二级缓存简单理解
2020-09-18 12:56:03上次谈到了 mybatis一级缓存实际上是SqlSession级别的缓存,多个SqlSession并不共享,针对这种情况,我们可以使用mybatis二级缓存来处理。 1.mybatis二级缓存是什么 mybatis二级缓存是mybatis的另一种缓存机制,... -
myBatis一二级缓存配置
2020-09-07 22:42:24一级缓存: 一级缓存不能关闭,但可以配置一级缓存的作用域。 一级缓存默认开启: <setting name="localCacheScope" value="SESSION"/>...localCacheScope:value有两个SESSION(默认)、...开启二级缓存:.. -
springboot+redis配置mybatis二级缓存
2019-05-27 19:37:54springboot+mybatis集+redis 二级缓存 每天多学一点点~ ...文章目录springboot+mybatis集+redis 二级缓存1.mybatis一二级缓存2.sprongboot配置mybatis3.springboot配置redis4.redis集成mybatis二级缓存5.测试6.... -
Mybatis二级缓存配置中readOnly属性的理解
2020-11-20 16:52:40二级缓存中有一个属性为readOnly 官网的解释如下: readOnly(只读)属性可以被设置为 true 或 false。 1.(true)只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能... -
mybatis一级缓存,二级缓存的开启、关闭、清除及使用说明
2021-02-02 15:16:56Mybatis一级缓存(默认开启) 是SqlSession级别的缓存, 默认开启 Mybatis二级缓存(默认关闭,一般不建议使用) namspace/mapper级别(跨sqlSession)的缓存, 默认关闭