当前位置: 首页 > article >正文

Mybaties缓存机制

Mybatis缓存机制

在 MyBatis 中,缓存机制是用来提高查询效率的一种方式。MyBatis 提供了两种内置的缓存机制:一级缓存和二级缓存。

1. 一级缓存(Local Cache)

一级缓存是基于 SqlSession 的。当你在同一个 SqlSession 中执行相同的 SQL 查询时,MyBatis 会从一级缓存中返回结果,而不是再次查询数据库。这意味着,如果你在同一个 SqlSession 中执行两次相同的查询,第二次查询会非常快,因为它直接从缓存中获取结果。

一级缓存的默认行为:
当 SqlSession 打开时,创建一个新的本地缓存。

在 SqlSession 执行插入、更新或删除操作时,它会清空本地缓存。

当 SqlSession 关闭时,缓存被销毁。

2. 二级缓存(Global Cache)

二级缓存是基于命名空间的,它可以跨 SqlSession 共享。这意味着,不同的 SqlSession 在执行相同的查询时,可以从二级缓存中获取结果,而不需要再次查询数据库。

二级缓存的配置步骤:
开启二级缓存:在 MyBatis 的配置文件(mybatis-config.xml)中全局启用二级缓存。

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

在映射文件中启用二级缓存:在具体的 Mapper XML 文件中启用二级缓存。

<mapper namespace="com.example.mapper.YourMapper">
    <cache/>
    <!-- 或者指定缓存策略 -->
    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
</mapper>

配置缓存策略:eviction(驱逐策略),flushInterval(刷新间隔),size(引用数目),readOnly(只读)。

注意事项:
二级缓存依赖于事务提交后才会刷新,因此在同一个 SqlSession 中对数据的修改不会立即反映到二级缓存中。只有在事务提交后,修改才会同步到二级缓存中。

如果需要跨 SqlSession 共享数据更改,可以考虑使用分布式缓存解决方案,如 Redis、EhCache 等,并结合 MyBatis 的缓存插件来实现。

使用二级缓存时,需要考虑数据一致性的问题,尤其是在高并发场景下。可以通过适当配置和监控来确保系统的稳定性和数据的准确性。

示例使用 EhCache 作为二级缓存:
添加 EhCache 依赖:

<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>

配置 MyBatis 使用 EhCache:

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

配置 EhCache:在 src/main/resources 下创建 ehcache.xml 文件。

<ehcache>
    <cache name="com.example.mapper.YourMapper" maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"/>
</ehcache>

通过这些步骤,你可以有效地利用 MyBatis 的缓存机制来提高应用程序的性能和响应速度。


http://www.kler.cn/a/522708.html

相关文章:

  • 机器人抓取与操作经典规划算法(深蓝)——2
  • 【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像
  • 循序渐进kubernetes-RBAC(Role-Based Access Control)
  • 如何跨互联网adb连接到远程手机-蓝牙电话集中维护
  • 日志收集Day008
  • DirectShow过滤器开发-读MP4视频文件过滤器(再写)
  • 装饰SpringMVC的适配器实现响应自动包装
  • 每日一题 429. N 叉树的层序遍历
  • WebPages 表单:设计与实现指南
  • react-bn-面试
  • 使用国内镜像加速器解决 Docker Hub 拉取镜像慢或被屏蔽的问题
  • 学习第七十六行
  • 备份与恢复管理系统深度解析及代码实践
  • GitHub 仓库的 Archived 功能详解:中英双语
  • 炫酷JavaScript文本时钟
  • 跨平台物联网漏洞挖掘算法评估框架设计与实现项目后期研究方案
  • 008 mybatis缓存
  • 全志 视频输入组件的使用
  • 强化学习在自动驾驶中的实现与挑战
  • RocketMQ优势剖析-性能优化
  • 安卓入门四十二 过渡动画
  • RAG制作客服机器人,文档用表格还是QA问答对?
  • python 一个组合问题:
  • LeetCode100之全排列(46)--Java
  • 无公网IP外网访问开源笔记 Logseq
  • 使用EVE-NG-锐捷实现OSPF