Mybatis--二级缓存(namespace级别)& 序列化

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis--二级缓存(namespace级别)& 序列化相关的知识,希望对你有一定的参考价值。

01:缓存简介&一级缓存
02:二级缓存
03:缓存原理

1. Mybatis--二级缓存(namespace级别)

  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存

工作机制

  • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
  • 如果会话关闭了,这个会员对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中
  • 新的会话查询信息,就可以从二级缓存中获取内容
  • 不同的mapper查询出的数据会放在自己对应的缓存中

一级缓存开启(SqlSession级别的缓存,也称为本地缓存)

  • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
  • 为了提高可扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来定义二级缓存。

1.1 使用二级缓存


1.1.1 开启全局缓存(虽然默认是开启的,但是为了方便理解,还是显示的开启)

在这里插入图片描述

mybatis-config.xml

<!--显示的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>

在这里插入图片描述


1.1.2 在Mapper.xml中使用缓存

可以使用默认的配置

<cache/>

使用默认的配置时,由于readOnly(只读)默认值是 false。需要通过序列化)返回缓存对象的拷贝。所以相关的实体类需要实现Serializable接口,使其支持序列化

序列化可以将一个对象转化成一段字符串编码,传输或者做存储处理,使用时再进行反序列,而字符串不用序列化的原因是如果你看过javaSE的源码,你就知道,字符串是已经实现了Serializable接口的,所以它已经是序列化了的


也可以自定义配置

<!--在当前Mapper.xml中使用二级缓存-->
<cache
       eviction="FIFO"
       flushInterval="60000"
       size="512"
       readOnly="true"/>

在这里插入图片描述
测试:
在这里插入图片描述
BlogMapper.xml
在这里插入图片描述

测试方法:

    @org.junit.Test
    public void test01() {
        SqlSession sqlSession1 = MybatisUtils.getSqlSession();
        BlogMapper mapper1 = sqlSession1.getMapper(BlogMapper.class);

        Map map = new HashMap();
        map.put("title", "微服务");
        List<Blog> blogs = mapper1.queryBlogIf(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }
        sqlSession1.close();

        System.out.println("==================");
        SqlSession sqlSession2 = MybatisUtils.getSqlSession();

        BlogMapper mapper2 = sqlSession2.getMapper(BlogMapper.class);
        map = new HashMap();
        map.put("title", "微服务");
        blogs = mapper2.queryBlogIf(map);
        for (Blog blog : blogs) {
            System.out.println(blog);
        }

        sqlSession2.close();
    }

在这里插入图片描述


1.1.3 小结

  • 只要开启了二级缓存,在同一个Mapper下就有效
  • 所有的数据都会放在一级缓存中
  • 只有当前会话提交,或者关闭的时候,才会提交到二级缓存中


以上是关于Mybatis--二级缓存(namespace级别)& 序列化的主要内容,如果未能解决你的问题,请参考以下文章

mybatis缓存之二级缓存

mybatis——一级缓存二级缓存

mybatis自带一级和二级缓存,为啥还要用redis

Mybatis缓存机制

MyBatis缓存机制-二级缓存

MybatisMybatis缓存