mybatis为什么不用二级缓存(mybatis的缓存机制是怎么样的)

本文目录
mybatis的缓存机制是怎么样的
Mybatis缓存处理机制
MyBatis缓存介绍
正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持
一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。
mybatis的cache-ref怎么使用
首先明确一点 cache-ref 只对二级缓存有效,没有使用二级缓存时,这东西没有意义。
以下说明只针对二级缓存。
当mybatis的当前命名空间存在DML的事务提交时,会使当前命名空间里的缓存失效,这样在查询时,会直接从数据库拿到数据,并再次缓存。但是如果是多表连接查询,如tableA join tableB,A表的DML操作在A的nameSpace,B表的DML操作在B的nameSpace,当B表在进行了数据修改时,不会使A表缓存失效,再使用tableA join tableB会直接从缓存中获取数据,因为此时缓存没有刷新,而且B表的数据也有变化,那么此时读取的就是脏数据。
此时就需要在B的nameSpace里使用《cache-ref namespace="A"/》,保证跟新B时,A的缓存也失效。再在A里面执行 tableA join tableB时,会重新从数据库里查询最新数据。
mybatis有必要用redis作缓存么
通常为了减轻数据库的压力,我们会引入缓存。在Dao查询数据库之前,先去缓存中找是否有要找的数据,如果有则用缓存中的数据即可,就不用查询数
据库了。如果没有才去数据库中查找。这样就能分担一下数据库的压力。另外,为了让缓存中的数据与数据库同步,我们应该在该数据发生变化的地方加入更新缓存
的逻辑代码。这样无形之中增加了工作量,同时也是一种对原有代码的入侵。这对于有着代码洁癖的程序员来说,无疑是一种伤害。
MyBatis框架早就考虑到了这些问题,因此MyBatis提供了自定义的二级缓存概念,方便引入我们自己的缓存机制,而不用更改原有的业务逻辑。
mybatis自带一级和二级缓存,为什么还要用redis
总配置文件中,二级缓存也是开启的,不需要设置
《setting name="cacheEnabled" value="true"/》
mapper级别的cache需要开启,在对应的mapper.xml写入
《!--开启本mapper的二级缓存--》
《cache/》

更多文章:
数据库管理系统和数据库系统分别侧重(数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例)
2026年9月7日 17:00
springmvc的依赖(springMVC的注入方式有哪几种,这与springMVC依赖)
2026年9月7日 14:00
display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)
2026年9月7日 11:00
timestamp without time zone(Postgresql中to_date()函数使用问题)
2026年9月7日 09:40








