前言
MyBatis 中的缓存是一种用于提高数据库访问性能的机制。它可以暂时保存数据库查询的结果,以便在后续的查询中直接从缓存中获取数据,而不必再次访问数据库。MyBatis 提供了两种级别的缓存:一级缓存和二级缓存。
一级缓存
一级缓存又称本地缓存,是默认开启。一级缓存是在SqlSession层面上实现的,这意味着在同一个SqlSession中执行相同的查询时,第一次查询得到的结果会被存储在缓存中,后续同样的查询可以直接从缓存中获取数据,避免了对数据库的重复访问。一级缓存的生命周期是和 SqlSession 相同的,当 SqlSession 关闭时,一级缓存也会被清空。
程序中分析一级缓存
@Test
public void testSelectById() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 获取 SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 获取一个实现了UserMapper接口的代理对象 通过这个代理对象可调用接口中定义的方法来执行数据库操作
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查询
User user1 = userMapper.selectById(1);
System.out.println(user1);
User user2 = userMapper.selectById(1);
System.out.println(user2);
System.out.println(user1 == user2);
sqlSession.close();
}
二级缓存
二级缓存又被称为全局缓存或共享缓存,二级缓存是指在多个 SqlSession 之间共享的缓存,作用域为NameSpace(Mapper)。当执行查询操作时,MyBatis 会先从二级缓存中查找结果,如果找到了则直接返回缓存中的结果,否则才会执行数据库查询。
注意:
- 二级缓存需要手动开启配置。
- 使用二级缓存的属性类必须是可序列化的。(pojo实现Serializable接口)
开启二级缓存
①mybatis-config.xml开启二级缓存
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 其他 -->
</configuration>
②去Mapper.xml中配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="selectById" resultType="com.itheima.pojo.User">
select *
from user
where id = #{id}
</select>
<!--配置二级缓存-->
<cache />
</mapper>
程序中分析二级缓存
@Test
public void testSelectById() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 获取 SqlSession 对象
SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
// 获取一个实现了UserMapper接口的代理对象 通过这个代理对象可调用接口中定义的方法来执行数据库操作
UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
// 查询
User user1 = userMapper1.selectById(1);
System.out.println(user1);
//SqlSession1在未提交的时候,SQL语句产生的查询结果还没有放入二级缓存中 这个时候SqlSession2 在查询的时候是感受不到二级缓存的存在的
sqlSession1.commit();//所以先提交
User user2 = userMapper2.selectById(1);
System.out.println(user2);
System.out.println(user1 == user2);
sqlSession1.close();
sqlSession2.close();
}
未开启二级缓存
开启二级缓存
注意:SqlSession1在未提交的时候,SQL语句产生的查询结果还没有放入二级缓存中 这个时候SqlSession2 在查询的时候是感受不到二级缓存的存在的。
小结
以上就是关于如何在程序中分析 Mybatis 的一二级缓存,如果你有更多见解,欢迎留言交流,若有不足之处,欢迎各位大佬指点。
创作不易,如果你觉得文章对你有所帮助,那就帮忙点赞关注吧!