-
2019-07-11 10:42:31
简单了解了下,个人观点
如果mapper中sql查询是多表关联查询,在开启二级缓存的情况下,第一次查询会在map中存放缓存,此时是application级下的map,第二次查询时候如果关联的表有修改,此时缓存数据是不变的,而查询依旧会命中,此时查询的数据就是脏数据。
更多相关内容 -
Mybatis二级缓存应用场景和局限性
2020-08-25 17:19:20对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。 实现方法如下: 通过设置刷新...二级缓存应用场景
- 对查询频率高,变化频率低的数据建议使用二级缓存。
- 对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
- 实现方法如下:
通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
mybatis局限性
- mybatis二级缓存对细粒度的数据级别的缓存实现不好。
- 比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。
-
mybatis二级缓存缺陷
2019-01-24 12:22:38或者这样理解,二级缓存是保存在Mapper对象中的,现在有一张user表,两个Mapper文件,AMapper.xml和BMapper.xml,B修改了user表中的内容,A是感知不到的,那么再从A里查询如果用到了缓存,就是旧的数据。转载:https://www.cnblogs.com/xrq730/p/6991655.html
或者这样理解,二级缓存是保存在Mapper对象中的,现在有一张user表,两个Mapper文件,AMapper.xml和BMapper.xml,B修改了user表中的内容,A是感知不到的,那么再从A里查询如果用到了缓存,就是旧的数据。 -
mybatis 二级缓存不推荐使用
2021-08-10 16:49:46一 mybatis的缓存使用。... 1.1mybatis的一级缓存是基于sqlsession为生命周期的 当你这个session没有了,缓存就没有了,其次当你sql执行!isselect语句的时候,缓存也会被直接全部清理掉以保证数据一致性。 ...一 mybatis的缓存使用。
大体就是首先根据你的sqlid,参数的信息自己算出一个key值,然后你查询的时候,会先把这个key值去缓存中找看有没有value,如果有,直接返回出来,就不查询db了。如果没有,那么查询db,然后将key,value保存到缓存中,以便下次使用。
1.1mybatis的一级缓存是基于sqlsession为生命周期的
当你这个session没有了,缓存就没有了,其次当你sql执行!isselect语句的时候,缓存也会被直接全部清理掉以保证数据一致性。
public int update(MappedStatement ms, Object parameter) throws SQLException { ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId()); if (closed) throw new ExecutorException("Executor was closed."); //清理缓存 clearLocalCache(); return doUpdate(ms, parameter); }
1.2 mybatis的二级缓存是基于application为生命周期的
范围是按照每个namepace一个缓存来存贮和维护,同一个namespace放到一个缓存对象中,当这个namaspace中执行了!isselect语句的时候,整个namespace中的缓存全部清除掉。
public int update(MappedStatement ms, Object parameterObject) throws SQLException { //清理缓存,并且!isselect语句的flushcache都是默认为true的。 flushCacheIfRequired(ms); return delegate.update(ms, parameterObject); }
三、Cache使用时的注意事项
1. 只能在【只有单表操作】的表上使用缓存
不只是要保证这个表在整个系统中只有单表操作,而且和该表有关的全部操作必须全部在一个namespace下。
2. 在可以保证查询远远大于insert,update,delete操作的情况下使用缓存
这一点不需要多说,所有人都应该清楚。记住,这一点需要保证在1的前提下才可以!
四、避免使用二级缓存
可能会有很多人不理解这里,二级缓存带来的好处远远比不上他所隐藏的危害。
缓存是以namespace为单位的,不同namespace下的操作互不影响。
insert,update,delete操作会清空所在namespace下的全部缓存。
通常使用MyBatis Generator生成的代码中,都是各个表独立的,每个表都有自己的namespace。
为什么避免使用二级缓存
在符合【Cache使用时的注意事项】的要求时,并没有什么危害。
其他情况就会有很多危害了。
针对一个表的某些操作不在他独立的namespace下进行。
例如在UserMapper.xml中有大多数针对user表的操作。但是在一个XXXMapper.xml中,还有针对user单表的操作。
这会导致user在两个命名空间下的数据不一致。如果在UserMapper.xml中做了刷新缓存的操作,在XXXMapper.xml中缓存仍然有效,如果有针对user的单表查询,使用缓存的结果可能会不正确。
更危险的情况是在XXXMapper.xml做了insert,update,delete操作时,会导致UserMapper.xml中的各种操作充满未知和风险。
有关这样单表的操作可能不常见。但是你也许想到了一种常见的情况。
多表操作一定不能使用缓存
为什么不能?
首先不管多表操作写到那个namespace下,都会存在某个表不在这个namespace下的情况。
例如两个表:role和user_role,如果我想查询出某个用户的全部角色role,就一定会涉及到多表的操作。
<select id="selectUserRoles" resultType="UserRoleVO"> select * from user_role a,role b where a.roleid = b.roleid and a.userid = #{userid} </select>
像上面这个查询,你会写到那个xml中呢??
不管是写到RoleMapper.xml还是UserRoleMapper.xml,或者是一个独立的XxxMapper.xml中。如果使用了二级缓存,都会导致上面这个查询结果可能不正确。
如果你正好修改了这个用户的角色,上面这个查询使用缓存的时候结果就是错的。
这点应该很容易理解。
在我看来,就以MyBatis目前的缓存方式来看是无解的。多表操作根本不能缓存。
如果你让他们都使用同一个namespace(通过<cache-ref>)来避免脏数据,那就失去了缓存的意义。
看到这里,实际上就是说,二级缓存不能用。整篇文章介绍这么多也没什么用了。
五、挽救二级缓存?
想更高效率的使用二级缓存是解决不了了。
但是解决多表操作避免脏数据还是有法解决的。解决思路就是通过拦截器判断执行的sql涉及到那些表(可以用jsqlparser解析),然后把相关表的缓存自动清空。但是这种方式对缓存的使用效率是很低的。
设计这样一个插件是相当复杂的,既然我没想着去实现,就不废话了。
最后还是建议,放弃二级缓存,在业务层使用可控制的缓存代替更好。
-
Springboot项目配置Mybatis二级缓存
2020-08-12 18:34:57什么是缓存? 简单来讲,缓存就是存储在缓冲区里的内容,或者可以理解为...Mybatis的缓存分为一级缓存和二级缓存。一级缓存是默认开启的,二级缓存需要手动开启。 一级缓存是SqlSession级别的缓存,作用域是一个SqlSess -
【Redis】-替代Mybatis二级缓存
2021-10-30 21:34:11文章目录1、二级缓存1.1、cache使用1.2、原理2、Redis替代二级缓存2.1、获取ApplicationContext2.2、自定义cache实现类2.3、关联查询的缓存处理3、缓存优化策略3.1、对key进行优化 1、二级缓存 作缓存的对象类型... -
MyBatis二级缓存应用场景以及局限性:
2018-08-18 17:39:54对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。 实现方法如下:通过设置刷新... -
MyBatis 二级缓存的开启与配置
2020-08-07 22:53:12mybatis的一级缓存是SqlSession级别的它是默认打开的,二级缓存为SQLSessionFactory级别的默认关闭。下面介绍二级缓存如何开启和配置。 二级缓存的开启 1、首先在mybatis配置文件的节点中配置整体开启二级缓存。 ... -
Mybatis的二级缓存问题
2017-06-28 21:09:53一、一级缓存、二级缓存的定义及区别 我们知道mybatis的对JDBC 的一个轻量级的封装,在运行速度方面优于hibernate。 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象... -
MyBatis的一级缓存、二级缓存区别及优势
2021-08-19 21:01:02MyBatis的一级缓存和二级缓存有什么区别? MyBatis的一级缓存:该缓存仅仅只会对sqlSession数据查询数据进行缓存,缓存至一个map中,生命周期很短,当sqlSession 消失时候消失,一级缓存是默认开启的,,每次的增... -
mybatis一级缓存与二级缓存的区别
2020-10-29 12:51:271、什么是缓存 [ Cache ] 存在内存中的临时数据 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据中)查询,从...mybatis系统中默认定义了两级缓存:一级缓存和二级缓存 默认情 -
闲谈MyBatis一级缓存和二级缓存区别
2020-09-02 14:17:04Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存。一级缓存只是相对于同一个SqlSession而言,生命周期和SqlSession一致。 生命周期 MyBatis在开启一个数据库会话时,会创建一个新的... -
mybatis二级缓存设置
2019-10-09 14:18:53缓存 什么是缓存 存储在运行内存中的数据 -- 缓存数据 计算机的存储方式效率不高,因此会将一些数据放在内存...mybatis默认开启了一级缓存 在同一个事务中,默认将sql查询结果进行缓存,如果之后还需要执行相同的... -
Mybatis二级缓存实现及原理
2019-08-23 19:37:52Mybatis二级缓存实现及原理 -
mybatis二级缓存实现
2019-08-27 20:01:40Redis是当今十分主流的分布式key-value型数据库,在web开发中,我们常用它来缓存数据库的查询结果。 本篇博客将介绍如何使用SpringBoot快速搭建一个Web应用,并且采用Mybatis作为我们的ORM框架。为了提升性能,我们.... -
MyBatis的一级缓存与二级缓存及优势
2021-08-19 20:13:29一、MyBatis的一级缓存和二级缓存有什么区别? 1.一级缓存:存在于同一个 SqlSession生命周期中,默认是开启的 在同一个 SqlSession中MyBatis 会把执行的方法和参数通过算法生成缓存的键值, 将键值和结果存放在一个 ... -
Springboot集成Mybatis之二级缓存
2020-02-13 14:36:02什么是缓存? 简单来讲,缓存就是存储在缓冲区里的内容,或者可以理解为存在内存中的内容。用户可以将经常查询的内容放到缓存中,再次使用时直接从缓存中取值,而不需要...Mybatis的缓存分为一级缓存和二级缓存。一... -
Mybatis一级缓存、二级缓存介绍及工作原理
2020-01-14 16:29:32如上图示:是一级缓存和二级缓存的关系 一级缓存是 sqlSession 级别的,在操作数据库时需要构造 sqlSession 对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域... -
mybatis04-mybatis源码-一级缓存、二级缓存
2019-11-29 15:24:45文章目录拓展阅读一级缓存具体流程注意事项开启日志打印源码分析缓存key创建最终查询方法执行update、inset方法一级缓存问题关闭一级缓存二级缓存mybatis缓存执行流程redis集成mybatis二级缓存mybatis.xml指定缓存二... -
Mybatis 为什么不要用二级缓存
2021-03-15 13:30:23mybatis 二级缓存不推荐使用一 mybatis的缓存使用。大体就是首先根据你的sqlid,参数的信息自己算出一个key值,然后你查询的时候,会先把这个key值去缓存中找看有没有value,如果有,直接返回出来,就不查询db了。... -
Mybatis一级缓存和二级缓存及区别
2019-12-04 16:12:36缓存: 概述:存在于内存中的临时数据。 缓存作用: 减少和数据库交互的次数,提高执行效率。 适用于缓存的: ...一级缓存 ** 它指的是Mybatis中SqlSession对象的缓存。 当我们执行查询之后,查询的结果会同时... -
谈谈Mybatis的一级缓存和二级缓存
2021-01-07 16:40:42Mybatis支持缓存,默认情况下是开启的一级缓存,一级缓存是SqlSession级别,缓存的是SqlSession对象。在SQL语句、参数都相同的情况下,我们使用同一个SqlSession对象调用同一个Mapper方法的时候,只需要执行一次SQL... -
SpringBoot、Mybatis如何开启二级缓存及存储到Redis中
2021-09-30 20:05:23一、得先了解一下什么是缓存?...缓存使用 cache 二级缓存 应用级缓存 本地缓存: 存储在当前应用所在服务器内存中数据称之为本地缓存 缺点 不能在分布式系统中共享 分布式缓存: 缓存数据不在由应用服务器自... -
【Java进阶营】面试官让我说一下Mybatis一级缓存、二级缓存的区别,史诗级回答让他刮目相看
2022-04-22 18:57:01面试中都会问起mybatis一级缓存和二级缓存,它体现出你对mybatis这个开发中的理解,如果照着答案背的话只能拿到一个及格分,所以今天咱们就好好聊聊mybatis。 另外本人整理了20年面试题大全,包含spring、并发、... -
mybatis一级缓存二级缓存
2021-05-16 19:15:13mybatis一级缓存二级缓存 一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个... -
Mybatis源码解析:为什么一级缓存和二级缓存都不建议使用?
2020-02-26 20:55:29介绍 要想了解缓存,就必须得了解一下Executor,这个Executor是干嘛的呢?你可以理解为要执行的SQL...可以看到具体组件实现类有一个父类BaseExecutor,而这个父类是一个模板模式的典型应用,操作一级缓存的操作都在. -
SSM之MyBatis_03_02_mybatis整合ehcache缓存、什么叫分布式、二级缓存应用场景、局限性
2021-04-21 01:01:43文章目录系列文章目录mybatis整合ehcache缓存前言什么是分布式mybatis整合ehcache缓存测试:用上面二级缓存例子即可二级缓存应用场景局限性 mybatis整合ehcache缓存 前言 我们在使用hibernate的时候,可以知道,... -
面试官让我说一下Mybatis一级缓存、二级缓存的区别,史诗级回答让他刮目相看
2020-11-26 20:49:00面试中都会问起mybatis一级缓存和二级缓存,它体现出你对mybatis这个开发中的理解,如果照着答案背的话只能拿到一个及格分,所以今天咱们就好好聊聊mybatis。 另外本人整理了20年面试题大全,包含spring、并发、... -
【MyBatis】关于MyBatis的一级缓存和二级缓存,你应该了解这些
2020-03-13 08:55:43春招正在火热进行中,对于Mybatis的一二级缓存问题,你能完美地回答给面试官吗?关于MyBatis的一级缓存和二级缓存,你应该了解这些