MyBatis缓存机制之一级缓存

MyBatis缓存机制之一级缓存

前言

        MyBatis内部封装了JDBC,简化了加载驱动、创建连接、创建statement等繁杂的过程,是我们常见的持久性框架。缓存是在计算机内存中保存的临时数据,读取时无需再从磁盘中读取,从而减少数据库的查询次数,提高执行效率。Mybatis提供了一级缓存和二级缓存的支持,默认情况下只开启一级缓存。本次将带着大家深入了解Mybatis的一级缓存机制。

介绍

        当我们访问数据库时,Mybatis会创建出一个SqlSession对象开启一次数据库会话。在这次会话中,我们可能会执行多次相同的查询语句,如果不采取措施,每一次查询都会访问数据库,造成资源的浪费。为了优化这部分场景,Mybatis提供了一级缓存的方案,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询。具体执行过程如下图所示。

         每个SqlSession中都持有Executor执行器,每个Excutor中有一个LocalCache缓存。Mybatis根据当前执行的SQL生产MappedStatement,在缓存中进行查询,如果缓存命中的话,直接返回结果给用户,如果缓存没有命中,查询数据库,结果写入LocalCache,再返回结果给用户。具体实现类的类关系图如下所示:

 

源码分析

我们将对MyBatis的源码进行分析,深入理解底层原理。

        SqlSession: SqlSession是应用程序与持久层执行交互操作的单线程对象,代表着一个资源的启用,包含所有执行SQL操作的方法。默认实现类是DefaultSqlSession。

        主要作用:1、获取Mapper接口;2、发送SQL给数据库;3、控制数据库事务

         Executor执行器:Executor定义了查询、更新、事务、缓存操作相关的接口方法,由SqlSession依赖,并受其调度与管理。核心功能是调度执行SQL。在Executor内部完成对LocalCache的查询和写入。

 

 Cache:Mybatis中的Cache接口,提供了缓存的基本操作。

         PerpetualCache是对Cache接口最基本的实现,其原理非常简单,内部持有HashMap,对一级缓存的操作实则是对HashMap的操作。如下代码所示:

        客户端与数据库的交互,首先通过DefaultSqlSessionFactory开启SqlSession:

                 在初始化SqlSession时,会通过configuration类创建一个新的Executor:

         SqlSession创建完毕后,根据不同类型的Statement,SqlSession会执行对应的方法。比如Select语句,最终会执行到selectList方法

        SqlSession把具体的查询交给Executor去执行。如果只开启了一级缓存的话,首先会进入BaseExecutor的query方法。代码如下所示:

        会根据传入的参数生成CacheKey作为唯一标识,进入方法,查看具体的生成逻辑:

        在上述的代码中,将MappedStatement的Id、SQL的offset、SQL的limit、SQL本身以及SQL中的参数传入了CacheKey这个类,最终构成CacheKey。在CacheKey的update方法中,会进行一个hashcode和checksum的计算,同时把传入的参数添加进updatelist中。如下代码所示:

 只要两条SQL的下列五个值相同,即可以认为是相同的SQL。

Statement Id + Offset + Limmit + Sql + Params

如果在LocalCache查不到的话,就会查询数据库,并将结果写入至缓存。

         如果是insert/update/delete方法,统一都会走SqlSession的update流程,同样委托执行器执行SQL。

        执行方法如下,我们可以发现每次执行update前都会清空LocalCache。所以当发生修改操作时,一级缓存会失效,防止了数据脏读。

 总结

1、一级缓存LocalCache只是BaseExecutor的一个字段。所以,当SqlSession的生命周期结束时,一级缓存也会被回收。

2、一级缓存由PerpetualCache实现,其内部通过HashMap完成对缓存的读写操作,所以本质上讲,一级缓存其实是通过HashMap实现的,Map中的key是由MappedStatement生成CacheKey,来确保查询的唯一性。

3、MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement。

Intellij IDEA 教程...............................................................................................................................2安装配置...................................................................................................................................2初始配置...........................................................................................................................优化配置.........................................................................................................................10项目管理.................................................................................................................................16同时管理多项目.............................................................................................................16创建 Maven 项目............................................................................................................20导入 Maven 项目............................................................................................................23JRebel 热部署 .................................................................................................................29常用技巧.................................................................................................................................36Debug 跟踪条件变量.....................................................................................................36Live Template 使用 .........................................................................................................37代码分析.........................................................................................................................39代码重构.........................................................................................................................4粘贴历史复制记录.........................................................................................................5查看本地历史记录.........................................................................................................56文本比较.........................................................................................................................57SSH 远程管理 .................................................................................................................58管理远程主机.................................................................................................................60快捷键大全.............................................................................................................................6编辑.................................................................................................................................62查找/替换.......................................................................................................................64编译/运行.......................................................................................................................64调试.................................................................................................................................64导航.................................................................................................................................65重构.................................................................................................................................66版本控制/本地历史.......................................................................................................66Live Template ..................................................................................................................66代码生成.........................................................................................................................67如何查找.........................................................................................................................67新特性.....................................................................................................................................68Terminal...........................................................................................................................68Search Anywhere ............................................................................................................69LENS Mode ......................................................................................................................69文件夹搜索.....................................................................................................................69搜索注释内容.................................................................................................................70Spring Bean Explorer.......................................................................................................
<think>嗯,用户想在IntelliJ IDEA 2024.1版本切换旧版UI主题设置。我需要先确认这个版本是否还有保留旧版UI的选项。记得从某个版本开始,JetBrains开始逐步转向新UI,可能在新版本中默认隐藏了旧版选项。 首先,用户可能已经尝试在设置里直接搜索“theme”或“UI”,但找不到旧版选项。这时候可能需要通过手动编辑配置文件来启用旧版UI。之前有用户提到过需要修改一些隐藏的设置项,比如`ide.experimental.ui`或者`ide.old.sidebar`之类的标志位。不过具体到2024.1版本,可能这些配置项的名称有没有变化呢? 然后,参考用户提供的引用内容,里面提到的是关于Neovim的LSP配置,可能和IDEAUI设置无关,但用户可能误以为配置文件的方式类似。我需要指出正确的配置文件位置,比如在IDEA中,通常是`idea.properties`或者在用户目录下的配置文件夹,比如`~/.config/JetBrains/IntelliJIdea2024.1`之类的路径。 接下来,步骤可能需要用户进入设置,使用快捷键打开设置,或者通过菜单导航到外观设置。如果新UI移除了主题选项,可能需要通过注册表(Registry)来调整。例如,在IDEA中,按Ctrl+Shift+A搜索“Registry”,然后找到相关选项如`ide.experimental.ui`并禁用。 另外,用户可能需要安装旧版主题插件,比如“Old IDE Theme”或者其他第三方主题,来模拟旧版外观。这部分需要确认插件是否兼容2024.1版本。 还要考虑是否有官方文档或社区讨论提到如何切换旧版UI。例如,JetBrains的博客或帮助文档可能有说明,或者在某些论坛如Stack Overflow上有解决方案。 最后,提醒用户如果手动修改配置文件,需要备份,避免意外错误。同时,建议用户检查是否有其他设置影响UI,比如高对比度模式或者自定义插件干扰。</think>### 将IntelliJ IDEA 2024.1切换旧版UI的方法 #### 步骤1:通过注册表启用旧版UI选项 1. **打开注册表编辑器**: 在IDEA界面中按下快捷键 `Ctrl+Shift+A`(Windows/Linux)或 `Cmd+Shift+A`(macOS),输入 `Registry` 并选择该选项。 2. **禁用实验性UI**: 在注册表列表中搜索 `ide.experimental.ui`,取消勾选该项以禁用新UI[^1]。 #### 步骤2:手动修改配置文件(备用方案) 若注册表修改无效,可尝试直接编辑配置文件: ```properties # 文件路径:<IDEA配置目录>/options/ide.general.xml <application> <component name="IdeMenuBar"> <option name="newUi" value="false" /> </component> </application> ``` #### 步骤3:使用旧版主题插件 在插件市场搜索并安装 `Old IDE Theme` 或 `Legacy UI` 类插件,部分插件可模拟经典界面样式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值