一级缓存
自动、默认开启、无法干涉
二级缓存
非自动、默认关闭、自定义
对于一级缓存的测试
@Test
public void selectWorkCardEmpByIdTest() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
WorkCard card = sqlSession.selectOne("com.qst.mapper.WorkCardMapper.selectWorkCardEmpById", 1);
System.out.println("工牌号:"+card.getCardId());
System.out.println("工牌名称:"+card.getRealName());
//延时修改数据库查看结果检验
try {
Thread.sleep(1000 * 20);
} catch (InterruptedException e) {
e.printStackTrace();
}
SqlSession sqlSession1 = sqlSessionFactory.openSession();
WorkCard card1 = sqlSession1.selectOne("com.qst.mapper.WorkCardMapper.selectWorkCardEmpById", 1);
System.out.println("工牌号:"+card1.getCardId());
System.out.println("工牌名称:"+card1.getRealName());
sqlSession.close();
sqlSession1.close();
}
测试结果分析
1. 使用相同的sessionFactory及session,调用两次查询,中间修改数据,两次查询结果一致的
- 小明(符合DB当前数据)
- 小明(不符合DB当前数据,可推断出是直接从一级缓存中读取)
2. 使用不同的sessionFactory及session,调用两次查询,中间修改数据,两次查询结果不一样的。
- 小明(符合DB当前数据)
- 小明(符合DB当前数据,从数据库中读取)
由此例子可知一级缓存 缓存在session中
对于二级缓存的测试
@Test
public void selectWorkCardEmpByIdTest() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
WorkCard card = sqlSession.selectOne("com.qst.mapper.WorkCardMapper.selectWorkCardEmpById", 1);
sqlSession.commit();
System.out.println("工牌号:"+card.getCardId());
System.out.println("工牌名称:"+card.getRealName());
SqlSession sqlSession1 = sqlSessionFactory.openSession();
WorkCard card1 = sqlSession1.selectOne("com.qst.mapper.WorkCardMapper.selectWorkCardEmpById", 1);
sqlSession1.commit();
System.out.println("工牌号:"+card1.getCardId());
System.out.println("工牌名称:"+card1.getRealName());
sqlSession.close();
sqlSession1.close();
}
Mapper映射文件中:
<mapper namespace="com.qst.mapper.WorkCardMapper">
<cache></cache>
.......
</mapper>
测试结果分析
1. 使用相同的sessionFactory,使用不同的session,调用两次查询,中间修改数据,两次查询结果不一样的。
- 马云(符合DB当前数据)
- 马云(不符合DB当前数据,可推断出是直接从二级缓存中读取)
2.使用不同的sessionFactory,使用不同的session,调用两次查询,中间修改数据,两次查询结果不一样的。
- 马云(符合DB当前数据)
- 马云(符合DB当前数据)
第二次测试结果不正确是因为二级缓存在sessionFactory中,所以两次要使用通同一个sessionFactory