MyBatis一级、二级缓存

前言

MyBatis 中的缓存是一种用于提高数据库访问性能的机制。它可以暂时保存数据库查询的结果,以便在后续的查询中直接从缓存中获取数据,而不必再次访问数据库。MyBatis 提供了两种级别的缓存:一级缓存和二级缓存。

一级缓存

一级缓存又称本地缓存,是默认开启。一级缓存是在SqlSession层面上实现的,这意味着在同一个SqlSession中执行相同的查询时,第一次查询得到的结果会被存储在缓存中,后续同样的查询可以直接从缓存中获取数据,避免了对数据库的重复访问。一级缓存的生命周期是和 SqlSession 相同的,当 SqlSession 关闭时,一级缓存也会被清空。

程序中分析一级缓存

    @Test
    public void testSelectById() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 获取 SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 获取一个实现了UserMapper接口的代理对象 通过这个代理对象可调用接口中定义的方法来执行数据库操作
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 查询
        User user1 = userMapper.selectById(1);
        System.out.println(user1);

        User user2 = userMapper.selectById(1);
        System.out.println(user2);

        System.out.println(user1 == user2);
        sqlSession.close();
    }

在这里插入图片描述

二级缓存

二级缓存又被称为全局缓存或共享缓存,二级缓存是指在多个 SqlSession 之间共享的缓存,作用域为NameSpace(Mapper)。当执行查询操作时,MyBatis 会先从二级缓存中查找结果,如果找到了则直接返回缓存中的结果,否则才会执行数据库查询。

注意:

  1. 二级缓存需要手动开启配置。
  2. 使用二级缓存的属性类必须是可序列化的。(pojo实现Serializable接口)

开启二级缓存

①mybatis-config.xml开启二级缓存

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <!-- 其他 -->
</configuration>

②去Mapper.xml中配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.UserMapper">

    <select id="selectById" resultType="com.itheima.pojo.User">
        select *
        from user
        where id = #{id}
    </select>

  <!--配置二级缓存-->
    <cache />
</mapper>

程序中分析二级缓存

    @Test
    public void testSelectById() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 获取 SqlSession 对象
        SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
        // 获取一个实现了UserMapper接口的代理对象 通过这个代理对象可调用接口中定义的方法来执行数据库操作
        UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);

        SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
        UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);

        // 查询
        User user1 = userMapper1.selectById(1);
        System.out.println(user1);
        //SqlSession1在未提交的时候,SQL语句产生的查询结果还没有放入二级缓存中 这个时候SqlSession2 在查询的时候是感受不到二级缓存的存在的
        sqlSession1.commit();//所以先提交

        User user2 = userMapper2.selectById(1);
        System.out.println(user2);
        System.out.println(user1 == user2);

        sqlSession1.close();
        sqlSession2.close();
    }

未开启二级缓存
在这里插入图片描述
开启二级缓存
在这里插入图片描述
注意:SqlSession1在未提交的时候,SQL语句产生的查询结果还没有放入二级缓存中 这个时候SqlSession2 在查询的时候是感受不到二级缓存的存在的。

小结

以上就是关于如何在程序中分析 Mybatis 的一二级缓存,如果你有更多见解,欢迎留言交流,若有不足之处,欢迎各位大佬指点。


创作不易,如果你觉得文章对你有所帮助,那就帮忙点赞关注吧!

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值