mybatis二级缓存实现_mybatis源码深度解析

mybatis二级缓存实现_mybatis源码深度解析 二级缓存的作用域是全局,换句话说,二级缓存已经脱离SqlSession的控制了。在测试二级缓存之前,我先把结论说一下:二级缓存的作用域是全局的,二级缓存在SqlSession关闭或提交之后才会生效。在分析MyBatis的二级缓存之前,我们先简单看下MyBatis中一个关于二级缓存的类(其他相关的类和接口之前已经分析过):org.apache.ibatis.mapping.Ma…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 

二级缓存的作用域是全局,换句话说,二级缓存已经脱离SqlSession的控制了。

在测试二级缓存之前,我先把结论说一下:

二级缓存的作用域是全局的,二级缓存在SqlSession关闭或提交之后才会生效。

在分析MyBatis的二级缓存之前,我们先简单看下MyBatis中一个关于二级缓存的类(其他相关的类和接口之前已经分析过):

org.apache.ibatis.mapping.MappedStatement:

MappedStatement类在Mybatis框架中用于表示XML文件中一个sql语句节点,即一个<select />、<update />或者<insert />标签。Mybatis框架在初始化阶段会对XML配置文件进行读取,将其中的sql语句节点对象化为一个个MappedStatement对象。

二级缓存跟一级缓存不同,一级缓存不需要配置任何东西,且默认打开。 二级缓存就需要配置一些东西。

其实二级缓存跟3个配置有关:

  1. mybatis全局配置文件中的setting中的cacheEnabled需要为true(默认为true,不设置也行)

  2. mapper配置文件中需要加入<cache>节点

  3. mapper配置文件中的select节点需要加上属性useCache需要为true(默认为true,不设置也行)

我们从在mapper文件中加入的<cache/>中开始分析源码,

1、XMLMappedBuilder(解析每个mapper配置文件的解析类,每一个mapper配置都会实例化一个XMLMapperBuilder类)的解析方法:解析完cache标签之后会使用builderAssistant的userNewCache方法,这里的builderAssistant是一个MapperBuilderAssistant类型的帮助类,每个XMLMappedBuilder构造的时候都会实例化这个属性,MapperBuilderAssistant类内部有个Cache类型的currentCache属性,这个属性也就是mapper配置文件中cache节点所代表的值:

2、现在mapper配置文件中的cache节点被解析到了XMLMapperBuilder实例中的builderAssistant属性中的currentCache值里。接下来XMLMapperBuilder会解析select节点,解析select节点的时候使用XMLStatementBuilder进行解析(也包括其他insert,update,delete节点):

3、最终mapper配置文件中的<cache/>被设置到了XMLMapperBuilder的builderAssistant属性中,XMLMapperBuilder中使用XMLStatementBuilder遍历CRUD节点,遍历CRUD节点的时候将这个cache节点设置到这些CRUD节点中,这个cache就是所谓的二级缓存!

现在我们发现使用二级缓存之后:查询数据的话,先从二级缓存中拿数据,如果没有的话,去一级缓存中拿,一级缓存也没有的话再查询数据库。有了数据之后在丢到TransactionalCache这个对象的entriesToAddOnCommit属性中。

 

org.apache.ibatis.cache.Cache是MyBatis的缓存接口,想要实现自定义的缓存需要实现这个接口。

MyBatis中关于Cache接口的实现类也使用了装饰者设计模式。

简单说明:

LRU – 最近最少使用的:移除最长时间不被使用的对象。

FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193257.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月29日 上午7:01
下一篇 2025年11月29日 上午7:43


相关推荐

  • FMX探索之FMX下绘文字绘制

    FMX探索之FMX下绘文字绘制Delphi 版本已升级到 10 1 经过官方的不断努力 版本也趋于稳定 在跨平台及 Anroid 开发方面的进步确定非常大 因此本人也开始尝试学习 FMX 尝试移动开发 使用 Delphi 工具入门真的非常之精简 随便拖几个控件 切换下编译平台 点击运行 就要以在各个平台上跑起来 但是今天在尝试在窗体上输出文字时 给难住了 在 VCL 下 代码是这样的 procedureTFo Button1

    2026年3月18日
    2
  • pycharm2021 激活码永久(最新序列号破解)

    pycharm2021 激活码永久(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    106
  • html怎么将表格居中_HTML居中代码

    html怎么将表格居中_HTML居中代码表格是一种以有组织的方式呈现大量信息的绝佳方式。销售数据、网页流量、股票市场趋势和学生成绩是经常以表格形式呈现的信息示例。使用HTML将表格添加到网页时,将其置于页面中心可能更具视觉吸引力。居中文本和图片通常是通过text-align类或通过CSS来完成的,但是居中表格需要不同的方法。下面提供了有关如何使表格在网页上居中的详细信息。将表格添加到网页时,默认情况下,它与页面或容器的左侧对齐,如下所示。上表的HTML源代码如下。要使此表居中,您需要添加;margin-left:auto;margin-r

    2026年1月21日
    7
  • 扫描系统漏洞的工具_免费漏洞扫描工具

    扫描系统漏洞的工具_免费漏洞扫描工具端口扫描之王NMAPNmap是一款非常强大的实用工具包含的功能如下:扫描到的端口状态:TCP扫描(-sT):这是一种最为普通的扫描方法,这种扫描方法的特点是:扫描的速度快,准确性高,对操作者没有权限上的要求,但是容易被防火墙和IDS(防入侵系统)发现运行的原理:通过建立TCP的三次握手连接来进行信息的传递SYN扫描(-sS):这是一种秘密的扫描方式之一,因为在SYN扫描中Client端和Server端没有形成3次握手,所以没有建立一个正常的TCP连接,因此不被防火墙和日志所记录…

    2025年11月3日
    8
  • 自定义鼠标光标:CSS cursor: url() 使用指南

    自定义鼠标光标:CSS cursor: url() 使用指南

    2026年3月16日
    5
  • conv2d卷积核_子集卷积

    conv2d卷积核_子集卷积学习torch框架中的卷积神经网络,对此进行记录一、nn.Conv2dnn.Conv2d(self,in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True))参数:in_channel:输入数据的通道数,例RGB图片通道数为3;out_channel:输…

    2025年8月24日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号