一级缓存 SqlSession级别
一级缓存也叫本地缓存。在Mybatis中,一级缓存是默认开启的。
一级缓存只存在于一个连接开启与关闭之间。在一个连接开启与关闭之间的查询结果会,存在一级缓存中。下一次再次查询此对象会直接从缓存中取出,而不再经过sql语句查询。
测试1:
@Test
public void myTest01(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
HashMap<String,Object> map = new HashMap();
map.put("author","作者2");
//第一次查询
List<Blog> blogIf = mapper.getBlogIf(map);
System.out.println("====================");
//第二次查询
List<Blog> blogIf2 = mapper.getBlogIf(map);
for (Blog blog : blogIf) {
System.out.println(blogIf);
}
sqlSession.close();
}

由上图可以看出,在同一个连接中,查询两次同一个对象,只走了一次SQL语句查询第一次查询的结果存到了一级缓存中,当下一次查询这个对象时,直接从缓存中取出,不再走SQL语句。
测试2:在两次查询相同结果中加入一个查询语句,并没有刷新此缓存,所以在第二次查询作者2时,同样是从缓存中提取。
@Test
public void myTest01(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
HashMap<String,Object> map = new HashMap();
HashMap<String,Object> map2 = new HashMap();
map.put("author","作者2");
map2.put("author","作者3");
//第一次查询作者2
List<Blog> blogIf = mapper.getBlogIf(map);
//第一次查询作者3
List<Blog> blogIf3 = mapper.getBlogIf(map2);
System.out.println("====================");
//第二次查询作者2
List<Blog> blogIf2 = mapper.getBlogIf(map);
for (Blog blog : blogIf) {
System.out.println(blogIf);
}
sqlSession.close();
}

测试3:在两次查询相同结果中加入一个insert语句,刷新此缓存,所以在第二次查询作者2时,需要重新查询。

缓存失效:
- 增删改操作,刷新缓存
- 查询不同的东西
- 查询不同的mapper.xml
- 手动清理缓存
sqlSession.clearCache();
二级缓存 namespace级别
二级缓存又叫全局缓存,在Mybatis中默认关闭,通过配置设置+标签开启二级缓存,在这种情况下,实体类需要进行实例化才可以进行操作。
<!-- 设置中开启二级缓存 -->
<settings>
<!--开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
实体类进行实例化:
@Data
public class Blog implements Serializable {
private String id;
private String title;
}
mapper.xml中开启二级缓存
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
测试:
@Test
public void myTest01(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
SqlSession sqlSession2 = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
BlogMapper mapper2 = sqlSession2.getMapper(BlogMapper.class);
HashMap<String,Object> map = new HashMap();
map.put("author","作者2");
List<Blog> blogIf = mapper.getBlogIf(map);
sqlSession.close();
System.out.println("====================");
List<Blog> blogIf2 = mapper2.getBlogIf(map);
sqlSession2.close();
}

二级缓存:在一个SqlSession关闭之后,该缓存会将结果存放到二级缓存中,这时当有新的连接查询此结果时,会直接从二级缓存中取出。
缓存原理:

本文深入解析MyBatis的一级缓存和二级缓存工作原理,一级缓存为SqlSession级别的本地缓存,自动开启,适用于同一连接的重复查询;二级缓存为namespace级别的全局缓存,需配置开启,支持跨连接的数据共享。

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



