Mybatis-8-一级缓存、二级缓存

本文详细解析MyBatis的一级缓存和二级缓存工作原理,包括缓存的触发条件、如何验证缓存的存在及如何配置二级缓存,帮助读者深入理解MyBatis的缓存机制。

一、一级缓存

mybatis的一级缓存是对SqlSession对象的缓存。

什么时候会清空一级缓存?
1.当手动调用了clearCache()方法
2.当SqlSession对象关闭了
3.当SqlSession对象执行的增、删、改、commit等


验证一级缓存的存在
	@Test
    public void testFirstLevelCache1() {
        //查找id为1的person数据
        System.out.println("-----------------1-----------------");
        Person person1 = mapper.findById(1);
        System.out.println(person1);

        //手动调用clearCache()方法,清除缓存
//        sqlSession.clearCache();

        //同样查找id为1的person数据
        System.out.println("-----------------2-----------------");
        Person person2 = mapper.findById(1);
        System.out.println(person2);
    }

不清除缓存的结果:只执行了一次查询语句,说明第二次查询的数据是从缓存中取的。
在这里插入图片描述
清除缓存的结果:执行了两次查询语句
在这里插入图片描述

验证关闭SqlSession对象,会清除缓存
	@Test
    public void testFirstLevelCache2() {
        //查找id为1的person数据
        System.out.println("-----------------1-----------------");
        Person person1 = mapper.findById(1);
        System.out.println(person1);

        //关闭SqlSession对象
        sqlSession.close();
        //重新打开SqlSession对象
        sqlSession = factory.openSession();
        mapper = sqlSession.getMapper(PersonMapper.class);

        //同样查找id为1的person数据
        System.out.println("-----------------2-----------------");
        Person person2 = this.mapper.findById(1);
        System.out.println(person2);
    }

关闭SqlSession对象后的结果:执行了两次查询语句
在这里插入图片描述

验证SqlSession执行了修改之后,会清空缓存
	@Test
    public void testFirstLevelCache3() {
        //查找id为1的person数据
        System.out.println("-----------------1-----------------");
        Person person1 = mapper.findById(1);
        System.out.println(person1);

        Person person = new Person();
        person.setName("123");
        person.setSex("女");
        person.setPid(1);

        //执行修改
        mapper.updatePerson(person);

        //同样查找id为1的person数据
        System.out.println("-----------------2-----------------");
        Person person2 = this.mapper.findById(1);
        System.out.println(person2);
    }

执行修改后的结果:执行了两次查询

在这里插入图片描述

二、二级缓存

mybatis的二级缓存是对SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession对象共享其缓存。

什么时候会清空二级缓存?
1.映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
2.缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。

现在让同一个SqlSessionFactory对象来创建两个SqlSession对象。让SqlSession对象来创建代理对象,通过代理对象来查询同一个数据。

	public void testSecondaryCache1() {
        System.out.println("------------------1------------------");
        SqlSession sqlSession1 = factory.openSession();
        PersonMapper mapper1 = sqlSession1.getMapper(PersonMapper.class);
        Person person1 = mapper1.findById(1);
        System.out.println(person1);
        sqlSession1.close();

        System.out.println("------------------2------------------");
        SqlSession sqlSession2 = factory.openSession();
        PersonMapper mapper2 = sqlSession2.getMapper(PersonMapper.class);
        Person person2 = mapper2.findById(1);
        System.out.println(person2);
        sqlSession2.close();
    }
不开启二级缓存的结果:执行了两次查询语句。

在这里插入图片描述

配置二级缓存:

1.在Mybatis配置文件中配置(这步可以省略,因为默认值就是true):
在这里插入图片描述

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

2.在对应的映射文件中配置:

<cache/>

3.在某个查询语句中配置(这步也可以省略,因为默认为true):useCache=“true”

	<select id="findById" resultMap="personMap" useCache="true">
        select * from t_person where pid=#{pid}
    </select>

开启二级缓存的结果:只查询了一次。因为是不同的SqlSession对象来执行的操作(与一级缓存无关),所以第二次数据的来自二级缓存。
在这里插入图片描述


更新时间:2020-1-16
内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值