「Java面试」五年Java程序员去某东面试竟然在MyBatis缓存这翻车

简介: 一个5年工作经验的小伙伴,去面某东被问到MyBatis何时使用一级缓存,何时使用二级缓存?去之前还特地复习了MyBatis的相关知识,想着自己用MyBatis用得比较熟练了,竟然在这道题上翻车了。今天,我给大家来分享一下MyBatis的缓存机制。
+关注继续查看

一个5年工作经验的小伙伴,去面某东被问到MyBatis何时使用一级缓存,何时使用二级缓存?去之前还特地复习了MyBatis的相关知识,想着自己用MyBatis用得比较熟练了,竟然在这道题上翻车了。

今天,我给大家来分享一下MyBatis的缓存机制。

另外,我花了1个多星期,准备了一份500页的PDF面试题解析配套文档,想获取的小伙伴可以扫描文章底部二维码领取!

1、设计思想

Mybatis里面设计了两级缓存来提升数据的检索效率,避免每次数据的访问都需要去查询数据库。

先来看一级缓存,它是SqlSession级别的缓存,也叫本地缓存,因为每个用户在执行查询的时候都需要使用SqlSession来执行,为了避免每次都去查数据库,MyBatis把查询出来的数据保存到SqlSession的本地缓存中,后续的SQL如果命中缓存,就可以直接从本地缓存读取。

那如果想要实现跨SqlSession级别的缓存?一级缓存就无法实现了,因此,MyBatis引入了二级缓存。当多个用户在查询数据的时候,只要有任何一个SqlSession拿到了数据就会放入到二级缓存里面,其他的SqlSession就可以从二级缓存加载数据。​

832d05a768c78da300709edfd788a6c4.jpg

2、原理分析

接下来,我给大家详细分析一下MyBatis缓存机制的实现原理。先来看一级缓存的实现原理:

在SqlSession 里面持有一个Executor的对象,每个Executor中有一个LocalCache对象。

当用户发起查询的时候,MyBatis会根据执行语句在Local Cache里面查询,如果没命中,再去查询数据库并写入到LocalCache,否则直接返回。

555db7d789ded65b4f071ac2b98b0ad1.jpg

所以,一级缓存的生命周期只在SqlSession级别,而且在多个SqlSession或者分布式环境下,可能会导致数据库写操作出现脏数据。


那这个时候,就要使用二级缓存。下面来看二级缓存的具体实现原理:

24da0aa1a42e9cbcca757edbe0e0cb49.jpg

二级缓存使用了一个叫做CachingExecutor的对象,对Executor进行了装饰,在进入一级缓存的查询流程之前,会先通过CachingExecutor进行二级缓存的查询。

开启二级缓存以后,会被多个SqlSession共享,所以它是一个全局缓存。因此它的查询流程是先查二级缓存,再查一级缓存,最后再查数据库。

另外,MyBatis 的二级缓存相对于一级缓存来说,实现了 SqlSession 之间缓存数据的共享,同时缓存粒度也能够控制到 Name Space 级别,并且还可以通过 Cache 接口实现类不同的组合,对 Cache 的可控性也更强。

以上就是我对这个问题的理解。在实际业务场景中,多级缓存的设计思想,非常值得我们学习和借鉴。学习底层技术的目的是为了提高技术思维能力和积累解决方案,才能够胜任更高的职位要求。

最后,我把之前分享的视频全部整理成了文字,想获取的小伙伴可以扫描文章底部二维码拿!希望能够以此来提高各位粉丝的通过率。

ee90d9963df444db88b33d6e798a5b94.gif

我是被编程耽误的文艺Tom,只弹干货不掺水!你们的支持就是我最大的动力!关注我,面试不再难!

相关文章
|
9天前
|
SQL XML Java
2020新整理Java技术栈面试题-Mybatis面试题
2020新整理Java技术栈面试题-Mybatis面试题
40 0
|
9天前
|
SQL Java 数据库连接
9999道-互联网大厂Java工程师面试题-之Mybatis面试题篇[每道题都会有相应的实例进行讲解,甚至源代码分析等](连续更新第1次)
9999道-互联网大厂Java工程师面试题-之Mybatis面试题篇[每道题都会有相应的实例进行讲解,甚至源代码分析等](连续更新第1次)
22 0
|
27天前
|
SQL Java 数据库连接
一般文章让你了解mybatis,以及如今在Java开发的地位!
一般文章让你了解mybatis,以及如今在Java开发的地位!
|
29天前
|
SQL Java 数据库连接
java:MyBatis动态SQL
动态SQL是一种在运行时构建和执行SQL查询语句的技术。它允许开发者根据不同的条件和参数来动态地生成SQL语句,以满足不同的业务需求
22 3
|
1月前
|
SQL XML Java
Java:MyBatis实现增删改查
MyBatis是一款开源的Java持久层框架,可以将SQL语句和Java程序代码进行分离,开发者无需直接编写JDBC代码,通过XML或注解的方式配置SQL语句和映射关系,简化了数据库操作的过程。MyBatis具有良好的扩展性和灵活性,提供了多种插件和自定义类型转换器等功能,广泛应用于企业级开发中。
18 0
|
1月前
|
SQL Java 数据库连接
Java:MyBatis讲解
MyBatis是一个开源的Java持久化框架,它提供了一个简化数据库访问的方法。MyBatis的主要目标是减少编写SQL代码的工作量,并提供了将数据库操作与Java对象的映射功能。
18 1
Java:MyBatis讲解
|
2月前
|
SQL Java 数据库连接
【Java】Mybatis查询数据库
【Java】Mybatis查询数据库
|
4月前
|
Java 关系型数据库 数据库连接
Java——mybatis逆向工程生成实体类
Java——mybatis逆向工程生成实体类
|
4月前
|
Java 关系型数据库 数据库连接
探索Java中的MyBatis Plus注解 @DbType:灵活处理数据库类型
在数据库操作中,不同的数据库系统可能具有不同的数据类型,如MySQL、Oracle、SQL Server等,这就需要我们在操作中处理不同的数据库类型。MyBatis Plus作为一款强大的ORM框架,提供了注解 `@DbType`,使得开发者能够更加灵活地处理数据库类型,从而在多数据库支持下轻松切换。本文将详细介绍 `@DbType` 注解的用法及其在持久层开发中的应用。
266 1
|
4月前
|
Java 数据库连接 数据库
解析Java中的MyBatis Plus注解 @EnumValue:优雅处理枚举值映射
在数据库操作中,枚举类型的值往往需要与数据库表中的某个字段进行映射,以便在操作中能够进行相应的转换。MyBatis Plus作为一款强大的ORM框架,提供了注解 `@EnumValue`,使开发者能够更加灵活地处理枚举值与数据库字段的映射关系,从而减少了繁琐的转换逻辑。本文将详细介绍 `@EnumValue` 注解的用法及其在持久层开发中的应用。
748 0
相关产品
云迁移中心
推荐文章
更多