MyBatis一二级缓存

发布于:2023-10-25 ⋅ 阅读:(82) ⋅ 点赞:(0)

什么是缓存:

缓存是用来提升效率的(像 redis )多次查询不走数据库

一级缓存:

mybatis 默认开启一级缓存
这个一级缓存又叫 sqlSession 缓存,它只能作用于同一个 sqlSession 对象( sqlSession 数据库的连接对象)
如上图A 发出查询操作,第一次先从 mysql 中查询出来存入一级缓存,再返回给 A ,当B 执行的是相同的 sql ,它会直接从缓存里拿数据(效率提高很多) ;执行了增删改的任意操作,都会清空一级缓存
注意:只有作用于同一个 sqqlSession 对象的查询才会走缓存

一级缓存的弊端:

spring 在整合 mybatis 之后每一次请求都是一个新的 sqlSession ,代表每次都不会走缓存

二级缓存:

二级缓存又叫 xml 缓存、 na'mespace 缓存、 mapper 缓存 ,原理与一级缓存一样,但是它可以作用于不同的sqlSession 对象(就像是用了 redis )但是它只能作用于同一个mapper 文件 (sql 写在哪,它的缓存就存在哪个 mapper.xml 文件中)
因为它不是默认的,所以要手动开启二级缓存需要配置:

第一步:

第二步:

二级缓存的弊端:

虽然二级缓存可以作用于不同的 sqlSession 对象,但是它只能作用于同一个 mapper 文件
例如:两张表的连表查询( account 表和 user 表)
A 做一个连表查询,它的二级缓存是存在 accountMapper.xml 文件里的,当 B 做了一个 user 表的修改
时,清除的是 userMapper.xml 里的缓存(只会清空主表的缓存),此时 C 再做于 A 相同的查询 sql 时,走的是accountMapper.xml 里的缓存,就会出现缓存与数据库数据不一致的情况
这就是为什么 mybatis 默认用的是一级缓存,不用二级缓存
一级缓存的应用场景:对数据的实时性要求不高的情况下,可以使用(虽然此时缓存与数据库数据不同,但只要有对account里的数据做增删改的操作,数据就会清空,就又同步了)
本文含有隐藏内容,请 开通VIP 后查看