系列七、Mybatis的二级缓存

本文介绍了Mybatis的二级缓存工作原理,如何在全局配置中开启,以及通过示例演示一级和二级缓存的区别。重点强调了SqlSession和namespace对缓存的影响,以及关闭SqlSession对数据缓存迁移的重要性。

一、概述

        Mybatis的二级缓存是多个sqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession执行两次相同的查询,mybatis会将第一次执行完的数据放到二级缓存中(坑:需要执行close操作,要不然不会往二级缓存中放),第二次的查询将不会再查询数据库,而是直接从缓存中取数据,从而提高开发效率。

注意事项:默认情况下,MyBatis只开启了一级缓存,没有开启二级缓存,如果需要开启二级缓存,需要做如下配置:

第一步:在mybatis的全局配置文件中开启二级缓存

<setting name="cacheEnabled" value="true"/>

第二步:在Mapper接口上添加注解 @CacheNamespace 或者 在xxxMapper.xml中使用<cache/>标签开启二级缓存(坑:只能二选一,不能同时配置)

二、二级缓存(生效)案例演示

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/2 11:27
 * @Description: 测试mybatis的二级缓存
 */
public class MyBatisLevel2CacheTest {

    private SqlSession sqlSession;

    @Before
    public void init() {
        sqlSession = SqlSessionFactoryUtil.getInstance().openSession();
    }

    @After
    public void close() {
        sqlSession.close();
    }

    /**
     * 测试mybatis的一级缓存
     *          mybatis一级缓存的作用域是同一个SqlSession,在同一个SqlSession中执行两次相同的查询,第一次执行完毕后,mybatis会将查询到的数据缓存起来(缓存到内存中),
     *      第二次执行相同的查询时,会从缓存中取数据,不再进行数据库的查询,从而提高查询效率
     */
    @Test
    public void test1() {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        UserDO u1 = userMapper.getUserById(1);
        System.out.println("u1 = " + u1);
        System.out.println("===============");
        UserDO u2 = userMapper.getUserById(1);
        System.out.println("u2 = " + u2);
    }

    /**
     * 测试mybatis的二级缓存
     *      mybatis的二级缓存是多个sqlSession共享的,其作用域是mapper下的同一个namespace,不同的sqlSession执行两次相同的查询,第一次执行完毕会将查询到的数据写到一级缓存(内存),
     *      当第一个sqlSession关闭时,才会将一级缓存中的数据序列胡到二级缓存中(磁盘),此时第二个sqlSession进行相同的查询,才能拿到二级缓存中的数据
     */
    @Test
    public void test2() throws IOException {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        SqlSession sqlSession2 = sqlSessionFactory.openSession();

        System.out.println("sqlSession1 = " + sqlSession1);
        System.out.println("sqlSession2 = " + sqlSession2);
        System.out.println(sqlSession1 == sqlSession2);
        System.out.println("================");

        UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
        UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
        UserDO u1 = userMapper1.getUserById(1);
        System.out.println(u1);
        sqlSession1.close();
        System.out.println("==================");
        UserDO u2 = userMapper2.getUserById(1);
        System.out.println(u2);
        sqlSession2.close();
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值