MyBatis——【二级缓存】

二级缓存
### MyBatis 一级缓存与二级缓存的作用及实际应用场景 #### 一级缓存 MyBatis 的一级缓存是指 **SqlSession** 级别的缓存,其作用范围仅限于同一个 `SqlSession` 实例内部。当在一个 `SqlSession` 中多次执行相同 SQL 查询时,MyBatis 会在第一次查询后将结果保存到一级缓存中,后续的相同查询会优先从缓存中读取数据,而不必再次访问数据库。 - **工作原理**: 在一次事务范围内或者未开启事务的情况下,只要 `SqlSession` 尚未被关闭或提交,MyBatis 会对重复的 SELECT 操作启用一级缓存[^1]。 - **优点**: 减少了对数据库的频繁访问,提升了单次操作内的性能。 - **局限性**: - 缓存的有效期仅为当前 `SqlSession` 生命周期内;一旦 `SqlSession` 关闭或提交,缓存就会失效[^3]。 - 如果在同一时间有其他线程通过不同的 `SqlSession` 修改了数据库中的数据,则可能导致脏读问题。 - **适用场景**: 适合用于短生命周期的操作,例如在同一线程中连续调用多个相同的查询语句,尤其是在批量处理逻辑中减少不必要的数据库交互。 --- #### 二级缓存 MyBatis二级缓存是跨 `SqlSession` 的全局缓存,通常应用于整个应用程序级别。它的作用范围覆盖所有 `SqlSession` 实例,并允许不同 `Mapper` 文件之间共享缓存数据。 - **工作原理**: 当某个 `Mapper` 启用了 `<cache>` 标签并配置好相应的参数后,在首次查询完成后,MyBatis 不仅会把结果放入一级缓存,还会将其写入二级缓存。之后即使创建新的 `SqlSession` 并重新发起同样的查询请求,也会尝试先从二级缓存加载数据而非直接查询数据库[^4]。 - **主要特性**: - 支持多种淘汰策略 (`eviction`) 和大小限制 (`size`) 设置; - 提供只读模式 (`readOnly=true`) 来保护缓存免受外部更改影响; - 可以通过 `flushInterval` 定义自动清理周期,防止长时间占用资源。 - **优势**: 显著降低高频查询的压力,特别适用于那些变化频率较低的数据集(如字典表、静态配置项等)。 - **潜在风险**: 若项目采用分布式架构部署,各节点间独立运行各自的 JVM 进程,此时默认基于内存管理的传统二级缓存方案容易引发一致性问题——因为各个实例上的本地副本可能彼此冲突而导致陈旧版本残留现象发生。因此在这种情况下推荐集成像 Redis 这样的集中化存储解决方案作为替代品[^2]。 - **典型实践案例**: 对于一些几乎不变的基础信息类表格(比如省份列表、状态码映射关系等等),完全可以放心大胆地利用起二级缓存功能来优化整体表现力。与此同时也要注意合理规划哪些地方确实需要长期驻留以及如何规避因网络延迟等因素带来的额外开销等问题。 ```xml <cache type="org.mybatis.caches.redis.RedisCache" /> ``` 上述 XML 片段展示了如何借助第三方插件扩展支持更高级别的持久化能力,从而有效应对复杂业务需求下的挑战。 --- ### 总结对比 | 属性 | 一级缓存 | 二级缓存 | |--------------|-----------------------------------|-------------------------------------| | 范围 | 单个 SqlSession | 多个 SqlSession | | 生效条件 | 同一 SqlSession 内部 | 整个项目层面 | | 数据更新敏感度 | 较高 | 较低 | | 使用成本 | 自动生效 | 需要显式声明和适当调整 | 尽管两者都能带来不同程度上的效率改进,但在具体选型过程中还需综合考虑目标系统的规模特点及其预期负载特征等方面因素加以权衡抉择。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值