应用开发

这样理解 MyBatis 缓存机制,真香!

字号+作者:益华科技来源:域名2025-11-05 11:50:01我要评论(0)

为了提高数据访问的性能,MyBatis 采用了一级缓存和二级缓存的缓存机制,那么它们是如何工作的?这篇文章,我们将详细介绍这两种缓存机制及其工作原理、配置方式和使用场景。首先,看一张原理图:接着,我们

为了提高数据访问的真香性能,MyBatis 采用了一级缓存和二级缓存的样理缓存机制,那么它们是解M机制如何工作的?这篇文章,我们将详细介绍这两种缓存机制及其工作原理、缓存配置方式和使用场景。真香

首先,样理看一张原理图:

接着,解M机制我们来详细地分析它们。缓存

一、真香一级缓存

一级缓存(也叫本地缓存)是样理 MyBatis 默认开启的,是解M机制基于 SqlSession 级别的缓存。也就是缓存说,在同一个 SqlSession 中,真香对于相同的样理查询,如果参数相同,解M机制MyBatis 会从一级缓存中直接获取数据,而不会再去执行数据库查询。

1. 特点

作用范围:同一个SqlSession 实例。

默认开启:无需额外配置。

清空时机:

执行insert、update、delete 操作时,一级缓存会被清空。调用SqlSession.clearCache() 方法手动清空。b2b供应网2. 工作原理

当使用同一个SqlSession 执行相同的 SQL 查询时,MyBatis 会先检查一级缓存是否存在对应的查询结果。如果存在,则直接返回缓存中的结果;如果不存在,则执行数据库查询并将结果放入一级缓存。

使用示例:

复制try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); User user1 = mapper.getUserById(1); // 查询数据库,结果存入一级缓存 User user2 = mapper.getUserById(1); // 从一级缓存中获取结果 // user1 和 user2 指向同一个对象 }1.2.3.4.5.6.

二、二级缓存(全局缓存)

二级缓存是基于 namespace(通常对应于 Mapper 接口)的缓存,作用范围超出了SqlSession,同一个 mapper 的多个SqlSession 共享一级缓存之外的缓存。二级缓存需要显式开启和配置。

1. 特点

作用范围:同一个 Mapper 的所有SqlSession 实例。

默认关闭:需要在配置文件中手动开启。

缓存实现:需要配置缓存实现类,如 MyBatis 自带的缓存或第三方缓存(例如 Ehcache、Redis)。

序列化:二级缓存中的对象需要序列化,以支持跨SqlSession 共享。

2. 启用步骤

(1) 全局配置:在全局配置文件mybatis-config.xml 中开启二级缓存。

复制<configuration> <settings> <setting name="cacheEnabled" value="true"/> </settings> ... </configuration>1.2.3.4.5.6.

(2) Mapper 配置:在每个需要使用二级缓存的 Mapper XML 文件中配置<cache> 标签。

复制<mapper namespace="com.example.mapper.UserMapper"> <cache/> <!-- SQL 语句定义 --> </mapper>1.2.3.4.

或者使用自定义缓存实现:

复制<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>1.

(3) 映射接口注解:可以通过注解方式配置缓存(适用于 MyBatis 3.2 及以上版本)。云服务器

复制@CacheNamespace public interface UserMapper { // 方法定义 }1.2.3.4. 3. 缓存清理策略

MyBatis 二级缓存使用的是基于读写的缓存策略,当涉及数据修改操作(insert、update、delete)时,会清理相关 Mapper 的二级缓存,以保证数据一致性。

使用示例:

复制// 第一个 SqlSession try (SqlSession session1 = sqlSessionFactory.openSession()) { UserMapper mapper1 = session1.getMapper(UserMapper.class); User user1 = mapper1.getUserById(1); // 查询数据库,结果存入一级和二级缓存 session1.commit(); } // 第二个 SqlSession try (SqlSession session2 = sqlSessionFactory.openSession()) { UserMapper mapper2 = session2.getMapper(UserMapper.class); User user2 = mapper2.getUserById(1); // 从二级缓存中获取结果 }1.2.3.4.5.6.7.8.9.10.11.12.

三、缓存的高级配置

1. 缓存刷新策略

可以通过<cache> 标签的属性来配置缓存的刷新策略,如:

eviction:指定缓存的清理策略(默认 LRU 策略)。flushInterval:指定缓存刷新时间间隔(单位:毫秒)。size:指定缓存的大小。readOnly:指定缓存是否为只读。

示例:

复制<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>1.2.3.4.5. 2. 使用第三方缓存

MyBatis 支持集成多种第三方缓存,如 Ehcache、Redis、Hazelcast 等。以 Ehcache 为例,配置步骤如下:

(1) 添加依赖:

复制<dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.6</version> </dependency>1.2.3.4.5.6.7.8.9.10.

(2) 配置 Mapper:

复制<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>1.

(3) 配置 Ehcache:

创建ehcache.xml 文件,配置缓存策略。

复制<ehcache> <cache name="com.example.mapper.UserMapper" maxEntriesLocalHeap="1000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="false"/> </ehcache>1.2.3.4.5.6.7.8.

四、缓存使用注意事项

数据一致性:使用二级缓存时,需要确保缓存与数据库的WordPress模板数据一致性,特别是在分布式环境下,推荐使用分布式缓存解决方案。

对象可序列化:二级缓存中的对象需要实现Serializable 接口,以支持缓存的序列化和反序列化。

避免缓存穿透:对高频率的查询,可以适当配置缓存,从而减少数据库的压力。

缓存命中率:合理设计查询语句和缓存策略,提升缓存的命中率,优化性能。

五、总结

本文,我们详细地介绍了 MyBatis 的缓存策略,包括一级缓存适用于单次请求中的重复查询,而二级缓存适用于跨请求的共享缓存。在实际应用中,应根据具体业务需求和系统架构,选择合适的缓存策略和实现方式,以达到最佳的性能优化效果。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 苹果X水货的性能与使用体验(探究苹果X水货的优缺点及购买建议)

    苹果X水货的性能与使用体验(探究苹果X水货的优缺点及购买建议)

    2025-11-05 11:46

  • 探索oppocoloros2.0(从界面设计到个性化定制,发现coloros2.0的无限魅力)

    探索oppocoloros2.0(从界面设计到个性化定制,发现coloros2.0的无限魅力)

    2025-11-05 11:33

  • 以U大师安装XP教程,快速轻松完成系统安装(使用U大师工具,快速安装XP系统,详细步骤全面解析)

    以U大师安装XP教程,快速轻松完成系统安装(使用U大师工具,快速安装XP系统,详细步骤全面解析)

    2025-11-05 10:26

  • 电脑显示错误无法加载PDF文档(解决电脑无法加载PDF文档的问题)

    电脑显示错误无法加载PDF文档(解决电脑无法加载PDF文档的问题)

    2025-11-05 10:05

网友点评
精彩导读
在 Ubuntu 平台,默认的中文字体有限,而且与 Windows 平台上的字体不相同。这就造成了,在 Ubuntu 平台上用 LibreOffice Writer 打开来自 Windows 平台的 Word 文档,原始的字体不能正常显示。可以采取从 Windows 复制字体文件到 Ubuntu,但这好像侵犯了版权,而且不符合开源精神。解决的办法还是有的,那就是在 LibreOffice 里设置字体替换(仅用于显示),尽量让来自 Windows 平台的 Word 文档显示原来的模样。一、设置仅用于显示的字体替换列表1、Ubuntu 默认的简体中文字体有三种:AR PL UKai 是一种楷体,AR PL UMing 是一种宋体,Droid Sans Fallback 是一种黑体。最后一种负责在 Ubuntu 平台上显示中文。2、现在有一篇来自 Windows 平台的 Word 文档,它里面包含了黑体、宋体、楷体、仿宋等字体。由于两个平台的字体名称不同,因此在 Ubuntu 平台上用 LibreOffice Writer 打开,都被显示成了黑体(也就是 Droid Sans Fallback)。3、那我们开始设置字体替换。点击菜单“工具”——“选项”。4、打开“选项”对话框。在对话框左侧点击“字体”,然后在右侧下方点选“使用替换列表”。5、在右侧上方“替换表”下的“字体”框中,输入需要被替换的字体,在右侧的“替换成”框中,点击下拉箭头,选择替换字体。如图,“字体”框中输入“仿宋”,“替换为”框中选择 AR PL UMing,然后点击最右侧的对勾。6、一条替换规则就加入到替换列表中了。再点选列表项前面的“始终”和“只屏幕显示”两个复选框。后一个复选框的作用是,在对文档进行修改、保存后,再传递到 Windows平台时,仍然保持 Windows 的字体不变。假如不打上这个对勾,文档被传递给 Windows 平台上用 Word 打开后,字体显示也会不正常了,会给用户造成困扰。7、用同样的方法,输入其他字体的替换列表项,如图。由于 Ubuntu 中文字体的局限,只能用 AR PL UKai 这种楷体,来代替显示 Winows 平台 Word 文档的各种楷体,而宋体、仿宋等,也只能用 AR PL UMing 这种宋体来代替显示。8、设置完成后,第1步骤的文档看起来就像如图这样,字体不再全部被单调地显示成黑体,也比较接近它在 Windows 平台上的原貌了。二、假如是新建的文档需要传递给Windows平台1、假如需要在 Ubuntu 平台上用 LibreOffice Writer 新建一篇文档,为确保文档被传递到 Windows 平台后能够正常显示,需要我们在编辑文档时,直接设定成后者的字体。如图,在右侧窗口中的字体名称框里,直接输入 Windows 平台的字体名称,然后在文档工作区输入文字。这样的文档被传递到 Windows 平台后,就会以设定好的字体显示,不会给其他用户带来困扰。

在 Ubuntu 平台,默认的中文字体有限,而且与 Windows 平台上的字体不相同。这就造成了,在 Ubuntu 平台上用 LibreOffice Writer 打开来自 Windows 平台的 Word 文档,原始的字体不能正常显示。可以采取从 Windows 复制字体文件到 Ubuntu,但这好像侵犯了版权,而且不符合开源精神。解决的办法还是有的,那就是在 LibreOffice 里设置字体替换(仅用于显示),尽量让来自 Windows 平台的 Word 文档显示原来的模样。一、设置仅用于显示的字体替换列表1、Ubuntu 默认的简体中文字体有三种:AR PL UKai 是一种楷体,AR PL UMing 是一种宋体,Droid Sans Fallback 是一种黑体。最后一种负责在 Ubuntu 平台上显示中文。2、现在有一篇来自 Windows 平台的 Word 文档,它里面包含了黑体、宋体、楷体、仿宋等字体。由于两个平台的字体名称不同,因此在 Ubuntu 平台上用 LibreOffice Writer 打开,都被显示成了黑体(也就是 Droid Sans Fallback)。3、那我们开始设置字体替换。点击菜单“工具”——“选项”。4、打开“选项”对话框。在对话框左侧点击“字体”,然后在右侧下方点选“使用替换列表”。5、在右侧上方“替换表”下的“字体”框中,输入需要被替换的字体,在右侧的“替换成”框中,点击下拉箭头,选择替换字体。如图,“字体”框中输入“仿宋”,“替换为”框中选择 AR PL UMing,然后点击最右侧的对勾。6、一条替换规则就加入到替换列表中了。再点选列表项前面的“始终”和“只屏幕显示”两个复选框。后一个复选框的作用是,在对文档进行修改、保存后,再传递到 Windows平台时,仍然保持 Windows 的字体不变。假如不打上这个对勾,文档被传递给 Windows 平台上用 Word 打开后,字体显示也会不正常了,会给用户造成困扰。7、用同样的方法,输入其他字体的替换列表项,如图。由于 Ubuntu 中文字体的局限,只能用 AR PL UKai 这种楷体,来代替显示 Winows 平台 Word 文档的各种楷体,而宋体、仿宋等,也只能用 AR PL UMing 这种宋体来代替显示。8、设置完成后,第1步骤的文档看起来就像如图这样,字体不再全部被单调地显示成黑体,也比较接近它在 Windows 平台上的原貌了。二、假如是新建的文档需要传递给Windows平台1、假如需要在 Ubuntu 平台上用 LibreOffice Writer 新建一篇文档,为确保文档被传递到 Windows 平台后能够正常显示,需要我们在编辑文档时,直接设定成后者的字体。如图,在右侧窗口中的字体名称框里,直接输入 Windows 平台的字体名称,然后在文档工作区输入文字。这样的文档被传递到 Windows 平台后,就会以设定好的字体显示,不会给其他用户带来困扰。