Mybatis缓存

缓存:将相同查询条件的sql语句执行一遍后所得到的结果存在内存或者某种缓存介质当中,当下次遇到一模一样的查询sql时候不在执行sql与数据库交互,而是直接从缓存中获取结果,减少服务器的压力;
mybatis的查询缓存又分为一级缓存和二级缓存,一级缓存的作用范围为同一个sqlsession,而二级缓存的作用范围为同一个namespace和mapper


一级缓存:
1.Mybatis自带一级缓存默认开启也叫本地缓存
2.Mybatis一级缓存作用域在SqlSession之间
3.当执行查询时Mybatis会去当前SqlSession找,没有就会去数据库
3.当SqlSession关闭缓存销毁,也可clearCache()手动清理,当执行curd后
缓存失效,需重新访问数据库

//按id查,验证一级缓存 
	/*mybatis默认开启一级缓存。第一次查询后放入Sqlsession,范围是同一个session
	第二次相同sql查询从Sqlsession拿。commit后清空。观察日志发现sql只执行了一次*/
		public static void findId2() throws IOException{
			SqlSession session=MybatisUtil.getSession();
			StudentMapper sm=session.getMapper(StudentMapper.class);
			Student student=sm.FindstuNo(3);
			//模仿commit
			//session.commit();
			Student student1=sm.FindstuNo(3);
			System.out.println(student.getStuNo()+","+student.getStuName());
			System.out.println(student1.getStuNo()+","+student1.getStuName());
			session.close();
		}

二级缓存:
1.二级缓存也叫全局缓存,因为一级缓存作用域太低
2.Mybatis自带二级缓存,也可通过第三方缓存插件。需要手动开启
3.基于namespace级别的缓存
4.被缓存的对象需要序列化接口
5.手动开启配置,通过实现Cache接口可以自定义二级缓存
二级缓存工作机制
1.一个会话查询一条数据,该数据会被放入当前会话一级缓存
2.当前会话关闭对应一级缓存消失,该数据就会被放入二级缓存
3不同mapper有自己对应的缓存


在mapper.xml中配置

<!-- 声明开启二级缓存 -->
	<cache
	eviction="FIFO"
	flushlnterval="60000"
	size="512"
	readOnly="true"/>

这里一般只写

<cache"/>

手动设置全局缓存

<!-- 开启二级缓存 -->
		<setting name="cacheEnabled" value="true"/>

demo

/**
		 * 二级缓存
		 * mybatis默认没有开启二级缓存
		 * 准备缓存的对象必须序列化接口
		 * 1:mybatis自带二级缓存
		 * 范围:同一个namespace生成mapper对象
		 * 2第三方提供二级缓存
		 * @throws IOException
		 */
		public static void findId3() throws IOException{
			SqlSession session=MybatisUtil.getSession();
			StudentMapper sm=session.getMapper(StudentMapper.class);
			Student student=sm.FindstuNo(3);
			session.close();//,把一级缓存的放进二级
			//第二次查询
			SqlSession session2=MybatisUtil.getSession();
			StudentMapper sm2=session2.getMapper(StudentMapper.class);
			Student student2=sm2.FindstuNo(3);
			System.out.println(student.getStuNo()+","+student.getStuName());
			System.out.println(student2.getStuNo()+","+student2.getStuName());
			session2.close();
		}

二级缓存流程
查询:从二级缓存拿到数据
存放:暂时放到一级缓存待销毁
销毁:转移到二级缓存

基于遗传算法的微电网调度(风、光、蓄电池、微型燃气轮机)(Matlab代码实现)内容概要:本文档介绍了基于遗传算法的微电网调度模型,涵盖风能、太阳能、蓄电池和微型燃气轮机等多种能源形式,并通过Matlab代码实现系统优化调度。该模型旨在解决微电网中多能源协调运行的问题,优化能源分配,降低运行成本,提高可再生能源利用率,同时考虑系统稳定性与经济性。文中详细阐述了遗传算法在求解微电网多目标优化问题中的应用,包括编码方式、适应度函数设计、约束处理及算法流程,并提供了完整的仿真代码供复现与学习。此外,文档还列举了大量相关电力系统优化案例,如负荷预测、储能配置、潮流计算等,展示了广泛的应用背景和技术支撑。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能电网优化研究的工程技术人员。; 使用场景及目标:①学习遗传算法在微电网调度中的具体实现方法;②掌握多能源系统建模与优化调度的技术路线;③为科研项目、毕业设计或实际工程提供可复用的代码框架与算法参考; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注目标函数构建与约束条件处理,同时可参考文档中提供的其他优化案例进行拓展学习,以提升综合应用能力。
### 三级标题:MyBatis 缓存机制的工作原理 MyBatis 提供了两种级别的缓存机制:一级缓存和二级缓存,分别适用于不同的使用场景,并通过特定的数据结构实现查询结果的存储与复用。 一级缓存是 SqlSession 级别的缓存,默认情况下是开启的。每个 SqlSession 都会维护一个本地缓存(基于 HashMap 实现),用于存储该 SqlSession 中执行过的查询结果。在同一个 SqlSession 中,如果执行相同的查询语句,则 MyBatis 会直接从缓存中获取数据,而不会再次访问数据库[^3]。当执行插入、更新或删除操作时,MyBatis 会自动清空当前 SqlSession 的一级缓存,以确保数据的一致性[^1]。 二级缓存是 Mapper(namespace)级别的缓存,多个 SqlSession 可以共享同一个 Mapper 的二级缓存。这意味着跨 SqlSession 的查询可以复用缓存数据,前提是这些查询属于相同的 Mapper 命名空间。二级缓存需要显式配置,可以通过接口注解方式实现,例如使用 `@CacheNamespace` 注解来启用指定 Mapper 接口的二级缓存功能[^2]。 以下是一个使用注解方式配置 MyBatis 二级缓存的示例: ```java @CacheNamespace public interface UserMapper { User getUserById(int id); } ``` ### 三级标题:MyBatis 缓存的使用注意事项 尽管缓存机制可以显著提升数据库查询性能,但在实际应用中需要注意以下几点。 首先,一级缓存的作用范围仅限于当前 SqlSession,不同 SqlSession 之间的缓存数据互不影响。因此,在涉及多个 SqlSession 或事务隔离级别较高的场景下,不能依赖一级缓存保证数据一致性[^4]。 其次,二级缓存虽然支持跨 SqlSession 共享数据,但其默认实现并不具备线程安全特性。在并发访问频繁的环境中,建议引入第三方缓存组件(如 Ehcache 或 Redis)以提高稳定性和可扩展性。此外,二级缓存的生命周期独立于 SqlSession,即使关闭或清除 SqlSession,缓存数据依然存在,因此必须谨慎管理缓存更新策略,避免出现脏读问题[^1]。 最后,由于缓存机制的存在,某些情况下可能会导致查询结果与数据库中的最新数据不一致。为了解决这一问题,可以在执行写操作后手动刷新缓存,或者通过配置合理的缓存失效时间来控制数据同步的粒度。同时,应避免对频繁更新的数据使用缓存,以免因频繁清空缓存而抵消性能优化效果[^3]。 ### 三级标题:相关代码示例 以下是一个展示 MyBatis 一级缓存行为的简单示例。在这个例子中,两次调用相同的查询方法将只触发一次数据库访问: ```java public class UserService { @Autowired private SqlSession sqlSession; public void testCache() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 第一次查询,结果从数据库中获取 User user1 = mapper.getUserById(1); // 第二次查询相同的记录,结果从一级缓存中获取,不再访问数据库 User user2 = mapper.getUserById(1); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值