Mybatis学习 ---缓存

本文深入解析MyBatis的一级缓存和二级缓存工作原理,一级缓存为SqlSession级别的本地缓存,自动开启,适用于同一连接的重复查询;二级缓存为namespace级别的全局缓存,需配置开启,支持跨连接的数据共享。
一级缓存 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时,需要重新查询。
在这里插入图片描述

缓存失效:

  1. 增删改操作,刷新缓存
  2. 查询不同的东西
  3. 查询不同的mapper.xml
  4. 手动清理缓存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关闭之后,该缓存会将结果存放到二级缓存中,这时当有新的连接查询此结果时,会直接从二级缓存中取出。

缓存原理:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值