ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Mybits一级二级缓存

Mybits一级二级缓存 一、SqlSession 是什么底层基础SqlSession 是 MyBatis 的数据库会话对象底层封装 JDBC 的 Connection 数据库连接所有数据库操作都要通过 SqlSession。 分两种使用场景原生 MyBatis代码手动openSession()创建、手动close()关闭。SpringBoot MyBatis项目常用框架自动管理 SqlSession业务代码不用手写。Spring 环境规则一次 HTTP 请求对应一个 SqlSession。同一个请求里所有的 select、update、delete共用这同一个 SqlSession多条 SQL 顺序执行不是并行。不管接口里面全是查询还是有增删改等整个 HTTP 请求处理完毕、返回前端之后SqlSession 才会关闭。SqlSession 一旦关闭对应的一级缓存直接销毁消失。SqlSession 关闭和有没有开启事务无关就算不开启事务请求结束会话照样关闭。二、一级缓存SqlSession 缓存默认开启无法关闭1. 作用在同一个 SqlSession同一次 HTTP 请求内部如果多处方法重复执行完全相同 SQL、相同参数避免重复访问数据库属于单次请求内的兜底优化。场景接口内部调用多个不同方法多个方法都写了相同查询不方便传递对象变量一级缓存生效。 如果你手动把查询结果存入变量复用一级缓存就用不上。2. 存储存放在当前 SqlSession 对象内部的 HashMapJVM 本地内存仅当前会话私有别的 SqlSession 看不到这份缓存。3. 写入时机执行 select 查询查到数据库结果立刻存入一级缓存。4. 一级缓存失效场景面试重点当前会话执行任意 insert /update/delete 增删改操作 → 直接清空当前 SqlSession 一级缓存后续查询需要重新访问数据库。手动调用sqlSession.clearCache()手动清空缓存。SqlSession 关闭缓存直接销毁。5. 优缺点✅优点开销极小风险低脏数据只会局限在当前这一次 HTTP 请求请求结束缓存直接消失不会扩散到别的请求。 ❌缺点只在单次请求生效跨请求无效只能作为兜底优化不能做全局业务缓存。三、二级缓存Mapper /namespace 命名空间缓存默认关闭需要手动开启namespace 对应一个 Mapper 映射文件。开启需要两个条件①Mapper 标签配置cache/②返回实体类实现Serializable序列化接口。1. 作用跨 SqlSession、跨 HTTP 请求共享查询结果。不同的数据库会话都可以读取同一份缓存不用每次都查数据库。2. 存储JVM 本地内存独立于 SqlSession。数据不是查到直接放二级缓存查询结果先存在一级缓存只有 SqlSession 执行 commit 提交或者 close 关闭之后才会把一级缓存的数据拷贝一份存入二级缓存。 SqlSession 关闭一级缓存销毁但是二级缓存里拷贝的数据还保留。3. 失效规则只要这个 Mappernamespace执行任意一条增删改语句直接清空这个 Mapper 命名空间下全部二级缓存不是只删单条数据粒度非常粗。4. 重大缺陷面试高频粒度粗修改一条数据整个 Mapper 所有缓存全部清空缓存命中率差。脏数据风险联表查询写在 A 的 Mapper 里修改关联的 B 表B 的 Mapper只会清空 B 的二级缓存不会清空 A 的二级缓存缓存里保留旧数据出现脏数据。单机缓存原生二级缓存是 JVM 内存只在当前这一台服务器生效集群多台服务服务器之间缓存互不共享分布式场景不适用。5. 开发现状业务项目基本不用 MyBatis 原生二级缓存。风险大、收益有限需要跨请求全局缓存直接使用 Redis。四、查询缓存查找顺序执行查询时查找顺序二级缓存 → 一级缓存 → 数据库先去二级缓存找找到直接返回二级缓存没有去当前 SqlSession 的一级缓存查找一级缓存也没有才访问数据库查询。五、MyBatis 缓存 和 Redis 缓存对比MyBatis 一、二级缓存JVM 本地内存。读取无网络 IO速度更快但是单机有效。一级缓存只能单次请求内生效原生二级缓存脏数据风险高。Redis 缓存独立中间件需要网络 IO速度比本地内存慢支持分布式多服务共享缓存 key 可以精细控制更新数据只删除对应 key不会一刀切清空全部缓存生产项目常用。六、一句话极简背诵版SqlSession 是 MyBatis 的数据库会话SpringBoot 环境一次 HTTP 请求对应一个 SqlSession请求结束会话关闭。 一级缓存是 SqlSession 会话级别默认开启同请求内重复查询可以减少数据库访问会话关闭缓存消失会话内增删改会清空一级缓存风险很低。 二级缓存是 Mapper 命名空间级别默认关闭会话提交或关闭后数据才存入实现跨请求共享但是粒度粗修改任意数据清空整个 Mapper 缓存联表场景容易脏数据单机有效生产一般不用改用 Redis。
返回列表