一、概述
Mybatis的二级缓存是多个sqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession执行两次相同的查询,mybatis会将第一次执行完的数据放到二级缓存中(坑:需要执行close操作,要不然不会往二级缓存中放),第二次的查询将不会再查询数据库,而是直接从缓存中取数据,从而提高开发效率。
注意事项:默认情况下,MyBatis只开启了一级缓存,没有开启二级缓存,如果需要开启二级缓存,需要做如下配置:
第一步:在mybatis的全局配置文件中开启二级缓存
<setting name="cacheEnabled" value="true"/>
第二步:在Mapper接口上添加注解 @CacheNamespace 或者 在xxxMapper.xml中使用<cache/>标签开启二级缓存(坑:只能二选一,不能同时配置)
二、二级缓存(生效)案例演示
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/11/2 11:27
* @Description: 测试mybatis的二级缓存
*/
public class MyBatisLevel2CacheTest {
private SqlSession sqlSession;
@Before
public void init() {
sqlSession = SqlSessionFactoryUtil.getInstance().openSession();
}
@After
public void close() {
sqlSession.close();
}
/**
* 测试mybatis的一级缓存
* mybatis一级缓存的作用域是同一个SqlSession,在同一个SqlSession中执行两次相同的查询,第一次执行完毕后,mybatis会将查询到的数据缓存起来(缓存到内存中),
* 第二次执行相同的查询时,会从缓存中取数据,不再进行数据库的查询,从而提高查询效率
*/
@Test
public void test1() {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserDO u1 = userMapper.getUserById(1);
System.out.println("u1 = " + u1);
System.out.println("===============");
UserDO u2 = userMapper.getUserById(1);
System.out.println("u2 = " + u2);
}
/**
* 测试mybatis的二级缓存
* mybatis的二级缓存是多个sqlSession共享的,其作用域是mapper下的同一个namespace,不同的sqlSession执行两次相同的查询,第一次执行完毕会将查询到的数据写到一级缓存(内存),
* 当第一个sqlSession关闭时,才会将一级缓存中的数据序列胡到二级缓存中(磁盘),此时第二个sqlSession进行相同的查询,才能拿到二级缓存中的数据
*/
@Test
public void test2() throws IOException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession1 = sqlSessionFactory.openSession();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
System.out.println("sqlSession1 = " + sqlSession1);
System.out.println("sqlSession2 = " + sqlSession2);
System.out.println(sqlSession1 == sqlSession2);
System.out.println("================");
UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
UserDO u1 = userMapper1.getUserById(1);
System.out.println(u1);
sqlSession1.close();
System.out.println("==================");
UserDO u2 = userMapper2.getUserById(1);
System.out.println(u2);
sqlSession2.close();
}
}
本文介绍了Mybatis的二级缓存工作原理,如何在全局配置中开启,以及通过示例演示一级和二级缓存的区别。重点强调了SqlSession和namespace对缓存的影响,以及关闭SqlSession对数据缓存迁移的重要性。


4979

被折叠的 条评论
为什么被折叠?



