为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis二级缓存学习入门

标签:
Java SSM 数据库
概述

本文将带你深入了解Mybatis二级缓存的原理与应用,帮助你掌握如何开启和配置二级缓存,提升查询性能。文章详细讲解了二级缓存的工作机制、配置方法以及使用案例,助你轻松应对实际开发中的缓存需求。mybatis二级缓存学习入门教程,带你一步步掌握Mybatis缓存机制的核心知识。

Mybatis缓存简介

Mybatis 是一个优秀的持久层框架,它支持自定义 SQL 查询、存储过程和高级映射。Mybatis 通过 XML 或注解的方式查询数据库,将每一条查询结果映射成 Java 对象,并且将 Java 对象封装成集合返回。Mybatis 是一个半自动化的持久化框架,它可以通过 XML 文件或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Object)类到数据库的列、表和关系。Mybatis 的核心特性之一是缓存机制,它能够提升查询性能,减少数据库的访问次数。缓存机制分为一级缓存和二级缓存。

什么是Mybatis缓存

Mybatis 缓存机制分为一级缓存和二级缓存。一级缓存主要负责缓存用户的单个会话。二级缓存主要负责缓存多个会话的单个命名空间的 SQL 语句查询结果。

Mybatis缓存的分类
  • 一级缓存(Local Cache):Mybatis 为每一个 SqlSession 都有一个与之对应的本地缓存,当 SqlSession 执行查询时,会将返回的结果进行缓存,当下次查询时,如果缓存中存在有效数据,则直接返回,不需要再次查询数据库。
  • 二级缓存(Local Cache):Mybatis 除了提供一级缓存外,还提供二级缓存,它与一级缓存不同,二级缓存是所有 SqlSession 共享的缓存,当 SqlSession 执行查询时,会将返回的结果进行缓存,当下次查询时,如果缓存中存在有效数据,则直接返回,不需要再次查询数据库。二级缓存默认关闭,如果需要使用二级缓存,需要手动开启。
Mybatis一级缓存详解
一级缓存的作用范围

一级缓存是基于 SqlSession 的,也就是说,当一个 SqlSession 执行多个查询时,这些查询的结果将会被缓存。默认情况下,这个 SqlSession 的缓存会被在同一个 SqlSession 中重复的查询所使用,从而避免了多次执行相同 SQL 语句。

一级缓存的工作原理

SqlSession 执行查询时,会将结果集中的数据缓存起来,当下次查询时,如果缓存中存在有效数据,则直接返回缓存中的数据,否则从数据库中查询数据并放入缓存。缓存的失效机制是由 SqlSession 自身控制的,当 SqlSession 关闭后,缓存自动失效。

示例代码

// 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml"));
// 创建 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询
List<User> users = sqlSession.selectList("com.itheima.mapper.UserMapper.findAll");
// 将结果存入缓存
for (User user : users) {
    sqlSession.getConfiguration().addMappedStatement("com.itheima.mapper.UserMapper.findAll");
    sqlSession.getConfiguration().getMappedStatement("com.itheima.mapper.UserMapper.findAll").getBoundSql((Object) null);
    sqlSession.getConfiguration().getCache("com.itheima.mapper.UserMapper").putObject(sqlSession, "com.itheima.mapper.UserMapper.findAll", users);
}
// 关闭 SqlSession
sqlSession.close();

示例代码详解

// 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml"));
// 创建 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询
List<User> users = sqlSession.selectList("com.itheima.mapper.UserMapper.findAll");
// 将结果存入缓存
for (User user : users) {
    // 获取映射语句配置
    sqlSession.getConfiguration().addMappedStatement("com.itheima.mapper.UserMapper.findAll");
    // 获取映射语句的绑定 SQL
    sqlSession.getConfiguration().getMappedStatement("com.itheima.mapper.UserMapper.findAll").getBoundSql((Object) null);
    // 获取缓存配置
    sqlSession.getConfiguration().getCache("com.itheima.mapper.UserMapper").putObject(sqlSession, "com.itheima.mapper.UserMapper.findAll", users);
}
// 关闭 SqlSession
sqlSession.close();
一级缓存的使用场景

一级缓存主要适用于以下场景:

  • 当一个 SqlSession 中执行多次相同 SQL 语句时,可以使用缓存。
  • 当一个 SqlSession 中执行多次查询操作时,可以使用缓存。
  • 当一个 SqlSession 中执行多次插入、更新、删除操作时,可以使用缓存(但是需要注意,插入、更新、删除操作会影响缓存的有效性,因此需要手动更新缓存)。
Mybatis二级缓存详解
二级缓存的作用范围

二级缓存是基于 Mapper 的,也就是说,当多个 SqlSession 共享同一个命名空间的 Mapper 时,这些 SqlSession 执行的查询结果将会被缓存。二级缓存默认是关闭的,需要手动开启。

二级缓存的工作原理

SqlSession 执行查询时,会将结果集中的数据缓存在二级缓存中,当下次相同的 SqlSession 执行相同的查询时,如果缓存中存在有效数据,则直接返回缓存中的数据,否则从数据库中查询数据并放入缓存。缓存的失效机制是由 SqlSession 自身控制的,当 SqlSession 关闭后,缓存自动失效。

示例代码

<!-- 配置二级缓存 -->
<cache />

二级缓存的默认配置

二级缓存默认是关闭的,需要手动开启。默认情况下,二级缓存存储对象为 Serializable 类型,存储结构为 HashMap,缓存的最大元素数量为 1024,缓存的存活时间为 60 秒。

如何开启二级缓存

为了开启二级缓存,可以在 SqlMapConfig.xml 配置文件中添加 <cache /> 标签,也可以在 Mapper.xml 文件中添加 <cache /> 标签。

示例代码

<!-- SqlMapConfig.xml -->
<configuration>
    <cache />
</configuration>
<!-- Mapper.xml -->
<cache />

示例代码详解

<!-- SqlMapConfig.xml -->
<configuration>
    <cache />
</configuration>
<!-- Mapper.xml -->
<cache />
Mybatis二级缓存的使用案例
实战演示:配置二级缓存

为了演示如何配置和使用二级缓存,我们需要在 SqlMapConfig.xmlMapper.xml 文件中添加 <cache /> 标签。

示例代码

<!-- SqlMapConfig.xml -->
<configuration>
    <cache />
</configuration>
<!-- Mapper.xml -->
<cache />

示例代码详解

<!-- SqlMapConfig.xml -->
<configuration>
    <cache />
</configuration>
<!-- Mapper.xml -->
<cache />
实战演示:测试二级缓存效果

为了测试二级缓存的效果,我们需要编写一个简单的测试用例。

示例代码

// 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml"));
// 创建 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询
List<User> users = sqlSession.selectList("com.itheima.mapper.UserMapper.findAll");
// 关闭 SqlSession
sqlSession.close();
// 重新创建 SqlSession
SqlSession sqlSession2 = sqlSessionFactory.openSession();
// 执行查询
List<User> users2 = sqlSession2.selectList("com.itheima.mapper.UserMapper.findAll");
// 关闭 SqlSession
sqlSession2.close();

示例代码详解

// 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("SqlMapConfig.xml"));
// 创建 SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询
List<User> users = sqlSession.selectList("com.itheima.mapper.UserMapper.findAll");
// 关闭 SqlSession
sqlSession.close();
// 重新创建 SqlSession
SqlSession sqlSession2 = sqlSessionFactory.openSession();
// 执行查询
List<User> users2 = sqlSession2.selectList("com.itheima.mapper.UserMapper.findAll");
// 关闭 SqlSession
sqlSession2.close();
Mybatis二级缓存的注意事项
常见问题与解决方案

常见问题

  • 二级缓存失效:当多个线程同时访问同一个命名空间的 Mapper 时,如果其中一个线程修改了缓存中的数据,其他线程可能会访问到失效的数据。
  • 二级缓存不生效:当配置文件中没有开启二级缓存,或者配置文件中的命名空间不正确时,二级缓存将不会生效。

解决方案

  • 为每个线程创建一个新的 SqlSession,以避免缓存失效的问题。
  • 检查配置文件中的命名空间是否正确,确保配置文件中已经开启了二级缓存。
二级缓存的局限性
  • 二级缓存默认存储的数据是 Serializable 类型,因此,如果需要存储的数据不是 Serializable 类型时,需要手动配置缓存的存储类型。
  • 二级缓存默认的最大元素数量为 1024,如果需要存储的数据量较大时,需要手动配置缓存的最大元素数量。
  • 二级缓存默认的存活时间为 60 秒,如果需要存储的数据存活时间较长时,需要手动配置缓存的存活时间。
  • 二级缓存默认存储结构为 HashMap,如果需要存储的数据结构较为复杂时,需要手动配置缓存的存储结构。
总结与扩展阅读
Mybatis二级缓存的优势
  • 二级缓存可以提高查询性能,减少数据库的访问次数。
  • 二级缓存可以降低数据库的负载,减轻数据库的压力。
  • 二级缓存可以提高系统的响应速度,提高用户体验。
推荐的学习资源
  • 慕课网:提供 Mybatis 的在线课程,帮助学习者快速掌握 Mybatis 的使用方法。
  • Mybatis 官方文档:提供 Mybatis 的详细配置说明,帮助学习者深入了解 Mybatis 的工作原理。
  • Mybatis GitHub 仓库:提供 Mybatis 的源码,帮助学习者深入了解 Mybatis 的实现细节。
  • Mybatis 问答社区:提供 Mybatis 的问答平台,帮助学习者解决 Mybatis 的使用问题。
  • Mybatis 技术交流群:提供 Mybatis 的技术交流平台,帮助学习者与其他 Mybatis 使用者交流经验。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消