Mybatis知识小汇(12)——缓存(一级缓存)

缓存

简介

什么是缓存?

  1. 存在内存中的临时数据
  2. 将用户经常查询的数据放在缓存中,用户查询数据就不用从磁盘上查询,从而提供查询效率,解决了高并发系统性的问题

为什么使用缓存?

  1. 减少和数据库的交互次数,减少系统开销,提供系统效率

什么样的数据能使用缓存?

  1. 经过查询并且不经常改变的数据
Mybatis缓存
  1. MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。

  2. 默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。

  3. 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

    <cache/>
    
一级缓存
  • 一级缓存也叫本地缓存:Sqlsession
    • 与数据库同一次会话期间查询到的数据会放在本地缓存中
    • 以后如果获取相同数据,直接从缓存中获取,没有必要载去查询数据库

测试步骤

  1. 开启日志

    <settings>
        <!--        标准的日志工厂实现-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    
  2. 测试在一个session中查询相同输出

    public class UserMapperTest {
        @Test
        public void selectById(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
            User user = mapper.selectById(1);
            System.out.println(user);
            System.out.println("==================================================");
            User user1 = mapper.selectById(1);
            System.out.println(user1);
    
            System.out.println(user == user1);
            sqlSession.close();
        }
    }
    
  3. 查看日志

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRquF1tS-1613531451314)(Mybatis.assets/image-20210217110103309.png)]

缓存失效的情况:

  1. 查询不同的对象

    @Test
    public void selectById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
        User user = mapper.selectById(1);
        System.out.println(user);
        System.out.println("==================================================");
        User user1 = mapper.selectById(2);
        System.out.println(user1);
    
        System.out.println(user == user1);
        sqlSession.close();
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iYkxUcuj-1613531451315)(Mybatis.assets/image-20210217104923963.png)]

  2. 增删除可能会改变原来的数据,所以必定会刷新缓存

    public class UserMapperTest {
        @Test
        public void selectById(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
            User user = mapper.selectById(1);
            System.out.println(user);
    
            mapper.updateUser(new User(2, "张三", "111111"));
            System.out.println("==================================================");
            User user1 = mapper.selectById(1);
            System.out.println(user1);
    
            System.out.println(user == user1);
            sqlSession.close();
        }
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VgQtkby1-1613531451317)(Mybatis.assets/image-20210217105636695.png)]

  3. 查询不同的mapper.xml

  4. 手动清理缓存

    public class UserMapperTest {
        @Test
        public void selectById(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
            User user = mapper.selectById(1);
            System.out.println(user);
    
            sqlSession.clearCache();//手动清理缓存
            System.out.println("==================================================");
            User user1 = mapper.selectById(1);
            System.out.println(user1);
    
            System.out.println(user == user1);
            sqlSession.close();
        }
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v5RvEVqN-1613531451317)(Mybatis.assets/image-20210217110320418.png)]

小结:

  • 一级缓存默认开启,只在一次sqlsession中有效,即连接到关闭。

  • 一级缓存就是一个Map
    上一节—>动态sql
    如有不对的地方欢迎指出,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值