功能篇:mybatis中实现缓存

server/2025/1/13 19:53:28/

MyBatis 提供了两种级别的缓存:一级缓存(本地会话缓存)和二级缓存(全局缓存)。理解这两种缓存的机制对于优化应用程序性能非常重要。

 

### 一级缓存

 

一级缓存是默认开启的,它作用于 `SqlSession` 级别。当同一个 `SqlSession` 中执行相同的查询语句时,MyBatis 会首先检查本地缓存中是否有结果集,如果有则直接返回缓存的数据,不再向数据库发送查询请求。但是,一旦 `SqlSession` 关闭或提交事务后,这个缓存就失效了。

 

#### 注意:

- 一级缓存不会跨越多个 `SqlSession` 实例。

- 如果在同一个 `SqlSession` 中对数据进行了更新、插入或者删除操作,那么相应的查询缓存会被清空,以保证数据的一致性。

 

### 二级缓存

 

二级缓存可以跨多个 `SqlSession` 实例,甚至可以在整个应用范围内共享。为了启用二级缓存,你需要做以下几件事情:

 

1. **配置 MyBatis 的缓存设置**:在 MyBatis 配置文件中设置 `<setting name="cacheEnabled" value="true"/>` 来开启二级缓存功能,默认情况下它是开启的。

 

2. **为映射器启用缓存**:在 Mapper XML 文件中添加 `<cache/>` 或者更复杂的 `<cache>` 定义来指定缓存行为,比如你可以定义缓存的时间、大小限制等参数。

 

   ```xml

   <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

   ```

 

   - `eviction`:指定了回收策略,如 FIFO(先进先出)、LRU(最近最少使用)、SOFT(软引用)或 WEAK(弱引用)。

   - `flushInterval`:设定自动刷新的时间间隔(毫秒),超过此时间后缓存将被清空。

   - `size`:设定缓存的最大条目数量。

   - `readOnly`:是否只读。如果设置为 true,则不同 Session 之间的缓存是可共享且不可修改的;如果设置为 false,则允许每个 Session 对自己的副本进行修改。

 

3. **确保实体类实现了序列化接口**:因为二级缓存可能会涉及到对象的序列化与反序列化过程,所以要求存储到二级缓存中的所有对象都必须实现 Java 的 `Serializable` 接口。

 

4. **管理缓存刷新**:如果你的应用程序频繁地修改数据,你可能需要更加精细地控制缓存的刷新逻辑。可以通过配置 `<select>` 语句的 `flushCache` 属性以及 `<insert>`, `<update>` 和 `<delete>` 语句的 `flushCache` 属性来决定何时清除缓存。

 

### 缓存插件

 

除了上述内置的缓存机制外,MyBatis 还支持通过插件扩展自定义缓存。例如,可以集成第三方缓存库,如 Ehcache、Caffeine 或 Redis 等,来提供更强大和灵活的缓存解决方案。

 

### 最佳实践

 

- **评估需求**:并非所有的查询都需要缓存,应该根据实际业务场景选择性地启用缓存。

- **监控缓存效果**:定期检查缓存命中率和其他性能指标,以确保缓存设置合理并有效提升性能。

- **保持数据一致性**:特别注意避免因缓存而导致的数据不一致问题,尤其是在分布式系统环境中。

 

综上所述,MyBatis 的缓存机制可以帮助减少重复查询数据库的次数,从而提高应用的整体性能。正确配置和使用缓存对于构建高效稳定的持久层至关重要。


http://www.ppmy.cn/server/158077.html

相关文章

【前端动效】HTML + CSS 实现打字机效果

目录 1. 效果展示 2. 思路分析 2.1 难点 2.2 实现思路 3. 代码实现 3.1 html部分 3.2 css部分 3.3 完整代码 4. 总结 1. 效果展示 如图所示&#xff0c;这次带来的是一个有趣的“擦除”效果&#xff0c;也可以叫做打字机效果&#xff0c;其中一段文本从左到右逐渐从…

Kafka 深度剖析

Kafka 深度剖析&#xff1a;从基础概念到集群实战 在当今大数据与分布式系统蓬勃发展的时代&#xff0c;Apache Kafka 作为一款极具影响力的分布式发布 - 订阅消息系统&#xff0c;宛如一颗璀璨的明星&#xff0c;照亮了数据流转与处理的诸多场景。它由 LinkedIn 公司于 2010 年…

ThreadLocal 的使用场景

在现代电商平台中&#xff0c;ThreadLocal 常用于以下场景&#xff0c;特别是与线程隔离相关的业务中&#xff0c;以提高性能和简化上下文传递。 1. 用户上下文信息管理 场景&#xff1a;在用户发起的每次请求中&#xff0c;需要携带用户 ID、角色、权限等信息&#xff0c;而这…

Megatron:深度学习中的高性能模型架构

Megatron&#xff1a;深度学习中的高性能模型架构 Megatron 是由 NVIDIA 推出的深度学习大规模预训练模型框架&#xff0c;主要针对大规模 Transformer 架构模型的高效训练与推理。Megatron 大多用于 GPT&#xff08;生成式预训练模型&#xff09;、BERT 等 Transformer 模型的…

状态模式详解与应用

状态模式&#xff08;State Pattern&#xff09;&#xff0c;是一种行为型设计模式。它允许一个对象在其内部状态改变时改变它的行为&#xff0c;使得对象看起来似乎修改了它的类。通过将不同的行为封装在不同的状态类中&#xff0c;状态模式可以避免大量的条件判断语句&#x…

【AI自动化渗透】大模型支持的自动化渗透测试,看蚂蚁和浙大的

参考文章: https://mp.weixin.qq.com/s/WTaO54zRxtNMHaiI1tfdGw 最近&#xff0c;美国西北大学&#xff0c;浙江大学&#xff0c;蚂蚁集团的一些专家学者联手发表了一篇论文&#xff0c;介绍了一个PentestAgent的方案&#xff0c;实现了渗透测试自动化。 01 技术方案 图的字…

贪心算法汇总

1.贪心算法 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 如何能看出局部最优是否能推出整体最优 靠自己手动模拟&#xff0c;如果模拟可行&#xff0c;就可以试一试贪心策略&#xff0c;如果不可行&#xff0c;可能需要动态规划。 如何验证可不可以…

JS爬虫实战演练

在这个小红书私信通里面进行一个js的爬虫 文字发送 async function sendChatMessage(content) {const url https://pro.xiaohongshu.com/api/edith/ads/pro/chat/chatline/msg;const params new URLSearchParams({porch_user_id: 677e116404ee000000000001});const messageD…