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();
		}

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

本指南详细阐述基于Python编程语言结合OpenCV计算机视觉库构建实时眼部状态分析系统的技术流程。该系统能够准确识别眼部区域,并对眨眼动作与持续闭眼状态进行判别。OpenCV作为功能强大的图像处理工具库,配合Python简洁的语法特性与丰富的第三方模块支持,为开发此类视觉应用提供了理想环境。 在环境配置阶段,除基础Python运行环境外,还需安装OpenCV核心模块与dlib机器学习库。dlib库内置的HOG(方向梯度直方图)特征检测算法在面部特征定位方面表现卓越。 技术实现包含以下关键环节: - 面部区域检测:采用预训练的Haar级联分类器或HOG特征检测器完成初始人脸定位,为后续眼部分析建立基础坐标系 - 眼部精确定位:基于已识别的人脸区域,运用dlib提供的面部特征点预测模型准确标定双眼位置坐标 - 眼睑轮廓分析:通过OpenCV的轮廓提取算法精确勾勒眼睑边缘形态,为状态判别提供几何特征依据 - 眨眼动作识别:通过连续帧序列分析眼睑开合度变化,建立动态阈值模型判断瞬时闭合动作 - 持续闭眼检测:设定更严格的状态持续时间与闭合程度双重标准,准确识别长时间闭眼行为 - 实时处理架构:构建视频流处理管线,通过帧捕获、特征分析、状态判断的循环流程实现实时监控 完整的技术文档应包含模块化代码实现、依赖库安装指引、参数调优指南及常见问题解决方案。示例代码需具备完整的错误处理机制与性能优化建议,涵盖图像预处理、光照补偿等实际应用中的关键技术点。 掌握该技术体系不仅有助于深入理解计算机视觉原理,更为疲劳驾驶预警、医疗监护等实际应用场景提供了可靠的技术基础。后续优化方向可包括多模态特征融合、深度学习模型集成等进阶研究领域。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### 三级标题: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); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值