网站首页 > java教程 正文
MyBatis 是一个优秀的 Java 持久层框架,它提供了强大的缓存机制来提高数据访问性能。MyBatis 的缓存机制主要分为一级缓存和二级缓存。
一级缓存
- 定义与作用
一级缓存也称为本地缓存,它是 MyBatis 中默认开启的缓存。一级缓存存在于 SqlSession 对象的生命周期中,当一个 SqlSession 执行查询操作后,MyBatis 会将查询结果放入一级缓存中。如果在同一个 SqlSession 中再次执行相同的查询,MyBatis 会直接从一级缓存中获取结果,而不会再次执行 SQL 查询,从而提高查询性能。例如,在一个业务方法中,多次调用同一个 Mapper 接口的查询方法,如果查询条件相同,那么第二次及以后的查询就会直接从一级缓存中获取结果,而不需要再次访问数据库。
- 缓存范围与失效情况
一级缓存的作用范围仅限于当前 SqlSession。当 SqlSession 执行了插入、更新或删除操作后,MyBatis 会清空当前 SqlSession 的一级缓存,以确保缓存中的数据与数据库中的数据保持一致。此外,如果在 SqlSession 中手动调用了clearCache()方法,也会清空一级缓存。例如,在一个业务方法中,先执行了查询操作,将结果放入一级缓存中,然后执行了插入操作,此时一级缓存会被清空。如果再次执行相同的查询操作,MyBatis 会重新执行 SQL 查询,并将结果放入一级缓存中。
二级缓存
- 定义与作用
二级缓存也称为全局缓存,它是在多个 SqlSession 之间共享的缓存。二级缓存的作用范围是 Mapper 级别的,即同一个 Mapper 接口的所有 SqlSession 都可以共享二级缓存中的数据。当一个 SqlSession 执行查询操作后,MyBatis 会将查询结果放入二级缓存中。如果其他 SqlSession 执行相同的查询,MyBatis 会先从二级缓存中获取结果,如果二级缓存中没有数据,再执行 SQL 查询。例如,在一个 Web 应用中,多个用户同时访问同一个页面,页面中的数据是通过 MyBatis 查询数据库得到的。如果开启了二级缓存,那么第一个用户查询数据后,MyBatis 会将查询结果放入二级缓存中。当其他用户访问同一个页面时,MyBatis 会先从二级缓存中获取数据,而不需要再次访问数据库,从而提高了系统的性能。
- 配置与使用
要使用二级缓存,需要在 Mapper XML 文件中添加<cache/>标签,并设置一些属性,如eviction(缓存回收策略)、flushInterval(刷新间隔)、size(缓存大小)等。此外,还需要在实体类中实现Serializable接口,以便 MyBatis 能够将实体类对象放入缓存中。例如,以下是一个 Mapper XML 文件中配置二级缓存的示例:
<mapper namespace="com.example.dao.UserMapper">
<cache eviction="LRU" flushInterval="60000" size="1024"/>
<!-- Mapper 接口中的 SQL 语句 -->
</mapper>
- 缓存范围与失效情况
二级缓存的作用范围是 Mapper 级别的,即不同的 Mapper 接口之间的二级缓存是相互独立的。当执行了插入、更新或删除操作时,如果对应的 Mapper 接口开启了二级缓存,并且操作影响了缓存中的数据,MyBatis 会清空该 Mapper 接口的二级缓存。此外,如果手动调用了SqlSessionFactory的clearCache()方法,也会清空所有的二级缓存。例如,在一个业务方法中,先执行了一个 Mapper 接口的查询操作,将结果放入二级缓存中。然后执行了另一个 Mapper 接口的插入操作,这个插入操作不会影响第一个 Mapper 接口的二级缓存。但是,如果执行了第一个 Mapper 接口的插入、更新或删除操作,那么这个 Mapper 接口的二级缓存会被清空。
MyBatis 的缓存机制可以有效地提高数据访问性能,减少数据库的访问次数。在实际应用中,可以根据具体的业务需求来选择使用一级缓存还是二级缓存,并合理配置缓存参数,以达到最佳的性能效果。
猜你喜欢
- 2024-10-25 Caffeine高性能本地缓存框架初探(caffeine缓存原理)
- 2024-10-25 Redis学习3——Redis应用之缓存(redis的缓存的使用方式)
- 2024-10-25 Java高级——缓存的使用场景(java缓存机制)
- 2024-10-25 java中常用的几种缓存类型介绍(java常用缓存技术)
- 2024-10-25 本地缓存之王caffeine#代码(本地缓存 js)
- 2024-10-25 skywalking agent 本地缓存队列参数设置
- 2024-10-25 史上最实用的:分布式缓存方案(分布式缓存设计方案)
- 2024-10-25 使用Guava作为本地缓存让系统飞起来
- 2024-10-25 深究分布式缓存的九个点(分布式缓存技术有哪些)
- 2024-10-25 面试题之java缓存总结,从单机缓存到分布式缓存架构
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)