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 – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • sm羞耻任务_羞耻驱动的发展

    sm羞耻任务_羞耻驱动的发展sm羞耻任务我一直渴望写出精巧的代码。在完成所有生产代码配对的日常工作中,我认为我们的质量很高。但是令人惊讶的是,当您独自编码时,您多么容易原谅自己并陷入不良习惯。配对时羞耻是品质背后的动力吗?我们有许多使用EasyMock编写的古老的单元测试;我们所有最近的单元测试都使用JMock。这笔小小的技术债务意味着,如果您要更改仅适用于EasyMock测试的代码,则首先必须决…

  • java 异或加密_使用异或实现一个简单的加密或解密

    java 异或加密_使用异或实现一个简单的加密或解密/**Copyright(C)2017,MegatronKing**LicensedundertheApacheLicense,Version2.0(the”License”);youmaynotusethisfileexcept*incompliancewiththeLicense.YoumayobtainacopyoftheLicenseat**http://www.apache.org/licenses/.

  • 面向对象设计原则

    面向对象设计原则

  • 内部服务器500错误原因解决方法_网站500服务器内部错误

    内部服务器500错误原因解决方法_网站500服务器内部错误今天网友发一远程协助,重启exchange2013后无法访问管理中心,提示“HTTP500内部服务器错误”,一开始以为是服务的问题,重启IIS仍然报错,后来通过查资料终于把问题解决了,现将整过过程记录下来,供后期遇到同来问题的朋友参考。1、访问出错图:2、解决方法:打开ExchangeManagementShell,运行以下命令禁用邮箱后再启用邮…

  • pycharm调试快捷键_pycharm调试debug入门

    pycharm调试快捷键_pycharm调试debug入门F7(单步调试):若该步骤中存在子函数,会进入子函数中执行单步调试。F8(单步调试):若该步骤中存在子函数,不会进入子函数,把子函数当做单步执行。F9:直接跳到下一个断点。…

    2022年10月24日
  • vscode新建html文件并快速生成标准的html代码[通俗易懂]

    vscode新建html文件并快速生成标准的html代码[通俗易懂]vscode下载安装:在官网下载vscode最新版本并安装,打开如图所示:步骤一:新建文件将自动生成Untitled-1文本文件步骤二:在打开窗口的文件右小角单击文件类型在弹出来的文件类型里选择html步骤三:在html文件里输入英文感叹号!,然后输入tab键,将自动生成标准的html…

发表回复

您的电子邮箱地址不会被公开。

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