本文将带你深入了解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 执行查询时,会将返回的结果进行缓存,当下次查询时,如果缓存中存在有效数据,则直接返回,不需要再次查询数据库。二级缓存默认关闭,如果需要使用二级缓存,需要手动开启。
一级缓存是基于 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
中执行多次插入、更新、删除操作时,可以使用缓存(但是需要注意,插入、更新、删除操作会影响缓存的有效性,因此需要手动更新缓存)。
二级缓存是基于 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.xml
和 Mapper.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 GitHub 仓库:提供 Mybatis 的源码,帮助学习者深入了解 Mybatis 的实现细节。
- Mybatis 问答社区:提供 Mybatis 的问答平台,帮助学习者解决 Mybatis 的使用问题。
- Mybatis 技术交流群:提供 Mybatis 的技术交流平台,帮助学习者与其他 Mybatis 使用者交流经验。
共同学习,写下你的评论
评论加载中...
作者其他优质文章