Mybatis缓存机制

简介: Mybatis缓存机制

什么是缓存? 为什么使用缓存? 什么场景下使用缓存?#
缓存(Cache)就是数据交换的缓冲区,一个临时存储数据的地方,当我们读取数据时会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话再从内存中找。

在实际开发中,我们会经常对数据库进行数据查询,而从数据库读取数据的效率是非常低下的,并且频繁地去访问数据库会增大数据库压力降低数据库查询性能等,所以我们可以将经常查询且不经常改变的数据保存到缓存中(缓存就是内存中的一个对象),这样用户在查询的时候就不用到数据库中查询(磁盘),从而减少与数据库的交付次数,从而提高查询效率,解决了高并发系统的性能问题。

缓存的本质就是用空间换时间,牺牲数据的实时性,以服务器内存中的数据暂时代替从数据库读取最新的数据,减少数据库IO,减轻服务器压力,减少网络延迟,从而提高访问速度。

Mybatis的一级缓存和二级缓存#
Mybatis一级缓存(sqlSession级别)#
​ 一级缓存是SqlSession级别的缓存,在操作数据库时需要构造SqlSession对象,在对象中有一个 数据结构(HashMap) 用于存储缓存数据,不同的SqlSession之间的缓存数据区域(HashMap)互不影响。

​ 当在同一个sqlSession (会话) 中执行两次相同的SQL语句时,第一次执行完毕会将从数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。需要注意的是,如果sqlSession执行了DML操作(insert、update、delete),并提交到数据库,MyBatis则会清空sqlSession中的一级缓存,这样做的目的是为了保证缓存中存储的是最新的信息,避免出现脏读现象。

MyBatis默认开启一级缓存,不需要进行任何配置,当一个sqlSession结束后该sqlSession的一级缓存也就不在了,一级缓存是不能关闭的。

测试说明:

​ 我们可以创建一张学生表,写sql查询语句根据id查询学生信息,定义一个方法,在方法内调用三次该查询,提前开启日志打印方便我们在控制台查看打印的sql语句,我们可以看到,只有第一次打印了sql语句也就是真正查询了数据库,后面的查询使用了一级缓存,直接在缓存中读取的数据并没有访问数据库。

​ 我们接着对上面的数据进行测试,从上面我们可以知道学生表中的数据已经存入到缓存中,接下来我们可以对数据进行(增/删/改)测试(insert、update、delete),再进行查询。可以发现进行了增、删、改操作后控制台打印了后面的查询sql语句,也就是再次访问了数据库进行查询,所以清空了一级缓存导致失效了。

​ 我们继续测试,这次我们开启两个SqlSession(会话),在SqlSession1中我们进行查询操作从而开启一级缓存,在SqlSession2我们可以进行(增/删/改)操作,再用SqlSession1去查询,可以发现出现了脏数据,SqlSession1并没有查询到SqlSession2修改后的数据。所以验证了一级缓存只在数据库会话内部共享

小结:

一级缓存(本地缓存), 作用域默认为sqlSession。当 Session flush 或 close 后, 该Session 中的所有Cache 将被清空。

本地缓存不能被关闭, 但可以调用clearCache()来清空本地缓存, 或者改变缓存的作用域。

在mybatis3.1之后,可以配置本地缓存的作用域,在 mybatis.xml 中配置。

让一级缓存失效的几种情况:

① 不同的SqlSession对应不同的一级缓存

② 同一个SqlSession但是查询条件不同
③ 同一个SqlSession的两次查询期间执行了增删改操作
④ 同一个SqlSession的两次查询期间手动清空了缓存

目录
相关文章
|
4月前
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
5月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
496 1
|
2月前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
2月前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
1月前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
32 1
|
1月前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
59 4
|
2月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
86 5
|
3月前
|
缓存 Java 数据库连接
使用MyBatis缓存的简单案例
MyBatis 是一种流行的持久层框架,支持自定义 SQL 执行、映射及复杂查询。本文介绍了如何在 Spring Boot 项目中集成 MyBatis 并实现一级和二级缓存,以提高查询性能,减少数据库访问。通过具体的电商系统案例,详细讲解了项目搭建、缓存配置、实体类创建、Mapper 编写、Service 层实现及缓存测试等步骤。
|
3月前
|
存储 缓存 负载均衡
Nginx代理缓存机制
【10月更文挑战第2天】
113 4