亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mybatis一級(jí)緩存和二級(jí)緩存的區(qū)別及說明

 更新時(shí)間:2022年11月21日 09:52:16   作者:小小少年_  
這篇文章主要介紹了mybatis一級(jí)緩存和二級(jí)緩存的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

我們通常說mybatis中一級(jí)緩存是sqlSession級(jí)別的,二級(jí)緩存是namespace級(jí)別的,這篇筆記主要來記錄下這么說的原理

結(jié)論

先說結(jié)論吧,一級(jí)緩存之所以說是sqlSession級(jí)別的,是因?yàn)橐患?jí)緩存的數(shù)據(jù)是存放在了sqlSession的一個(gè)內(nèi)部屬性中,所以,每次openSession()開啟一個(gè)sqlSession之后,一級(jí)緩存就會(huì)失效

二級(jí)緩存之所以可以跨sqlSession,是因?yàn)槎?jí)緩存的數(shù)據(jù),是存放在mappedStatement對(duì)象中的一個(gè)內(nèi)部屬性中,這里說的內(nèi)部屬性其實(shí)不太準(zhǔn)確,但是先忽略,后面會(huì)詳細(xì)解釋

我們知道,mybatis在啟動(dòng)的時(shí)候,會(huì)解析全局配置文件,會(huì)把mapper.xml文件中的一個(gè)個(gè)sql片段,解析成一個(gè)個(gè)mappedStatement對(duì)象,所以,這里二級(jí)緩存自然也就是namespace級(jí)別的

源碼

在mybatis源碼中,CachingExecutor是二級(jí)緩存的處理類,BaseExecutor是一級(jí)緩存的處理類

我們先來看一級(jí)緩存的處理

一級(jí)緩存

這里是一級(jí)緩存的處理,會(huì)發(fā)現(xiàn),這里是從localCache中根據(jù)key獲取value的,換而言之,這里的localCache大概率就是我們所謂的一級(jí)緩存了,我們看下localCache是在哪里賦值的

可以看到,localCache是在BaseExecutor的構(gòu)造函數(shù)中,每次new 出來的,所以,這里我們可以知道,只要new 一個(gè)BaseExecutor對(duì)象,就會(huì)有一個(gè)localCache,那對(duì)應(yīng)的一級(jí)緩存就不一樣,我們?cè)倏聪?,在正常的sql執(zhí)行過程中,BaseExecutor是在什么時(shí)候初始化的

org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSession()
    org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSessionFromDataSource
        org.apache.ibatis.session.Configuration#newExecutor()

這里可以看到,在通過openSession()初始化sqlSession對(duì)象的時(shí)候,就會(huì)初始化一個(gè)executor對(duì)象

所以,我們說一級(jí)緩存是executor級(jí)別的

二級(jí)緩存

我們接著來看二級(jí)緩存的邏輯

二級(jí)緩存是從這里的tcm這個(gè)對(duì)象中來獲取的,但是實(shí)際上,我們調(diào)到tcm.getObject()方法中,會(huì)發(fā)現(xiàn)實(shí)際上是從入?yún)⒌腸ache來獲取的,所以我們需要看下這里入?yún)⒌腸ache是從哪里獲取到的

可以看到這個(gè)方法的第一行,是從MappedStatement對(duì)象中獲取到的

可以看到,mappedStatement對(duì)象是從configuration對(duì)象中獲取到,所以我們要看下configuration的mappedStatement對(duì)象是什么時(shí)候賦值的

org.apache.ibatis.builder.MapperBuilderAssistant#addMappedStatement()

在這個(gè)方法中,可以看到,最終會(huì)把statement對(duì)象設(shè)置的configuration中,同時(shí)需要注意的是,我們用到的cache對(duì)象是從currentCache來的,所以我們需要關(guān)注,currentCache是從哪里來的?

在同類中,org.apache.ibatis.builder.MapperBuilderAssistant#useNewCache

這個(gè)方法中,會(huì)給currentCache賦值

如果看過前面兩篇關(guān)于mybatis源碼解析博客的,應(yīng)該會(huì)比較清楚,這里的useNewCache()方法,就是在解析mapper.xml文件中的節(jié)點(diǎn)時(shí),調(diào)用的

org.apache.ibatis.builder.xml.XMLMapperBuilder#configurationElement
    org.apache.ibatis.builder.xml.XMLMapperBuilder#cacheElement
        org.apache.ibatis.builder.MapperBuilderAssistant#useNewCache

截圖中的這個(gè)方法是解析一個(gè)mapper.xml的邏輯

所以,我們發(fā)現(xiàn)

在解析mapper.xml文件的時(shí)候,會(huì)解析配置的節(jié)點(diǎn),在解析這個(gè)節(jié)點(diǎn)的時(shí)候,會(huì)初始化一個(gè)cache對(duì)象,這個(gè)cache對(duì)象,會(huì)賦值給currentCache然后繼續(xù)解析一個(gè)個(gè)sql片段,這一個(gè)mapper.xml文件中,無論有多少個(gè)sql,這里的currentCache都是一樣的二級(jí)緩存在使用的時(shí)候,會(huì)從mappedStatement對(duì)象中獲取currentCache,如果currentCache不為null,就表示需要使用二級(jí)緩存然后從currentCache,根據(jù)key獲取value這里需要知道的是:這里的currentCache,也是對(duì)PerpetualCache的包裝,以前文章有介紹過,這次不做過多的解讀

所以,我們說二級(jí)緩存是namespace級(jí)別的

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談@PostConstruct不被調(diào)用的原因

    淺談@PostConstruct不被調(diào)用的原因

    這篇文章主要介紹了淺談@PostConstruct不被調(diào)用的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot Mybatis動(dòng)態(tài)數(shù)據(jù)源切換方案實(shí)現(xiàn)過程

    SpringBoot Mybatis動(dòng)態(tài)數(shù)據(jù)源切換方案實(shí)現(xiàn)過程

    這篇文章主要介紹了SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換方案過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java導(dǎo)出excel時(shí)合并同一列中相同內(nèi)容的行思路詳解

    Java導(dǎo)出excel時(shí)合并同一列中相同內(nèi)容的行思路詳解

    這篇文章主要介紹了Java導(dǎo)出excel時(shí)合并同一列中相同內(nèi)容的行,需要的朋友可以參考下
    2018-06-06
  • 關(guān)于SpringMVC的數(shù)據(jù)綁定@InitBinder注解的使用

    關(guān)于SpringMVC的數(shù)據(jù)綁定@InitBinder注解的使用

    這篇文章主要介紹了關(guān)于SpringMVC的數(shù)據(jù)綁定@InitBinder注解的使用,在SpringMVC中,數(shù)據(jù)綁定的工作是由 DataBinder 類完成的,DataBinder可以將HTTP請(qǐng)求中的數(shù)據(jù)綁定到Java對(duì)象中,需要的朋友可以參考下
    2023-07-07
  • Java中通過三級(jí)緩存解決Spring循環(huán)依賴詳解

    Java中通過三級(jí)緩存解決Spring循環(huán)依賴詳解

    這篇文章主要介紹了Java中通過三級(jí)緩存解決Spring循環(huán)依賴詳解,當(dāng)出現(xiàn)兩個(gè)或多個(gè) Bean 在初始化時(shí)相互依賴的情況時(shí),Spring Boot 會(huì)將其中一個(gè) Bean 提前暴露出來,以便其他 Bean 能夠在初始化時(shí)正確地引用它,這一策略能有效避免循環(huán)依賴導(dǎo)致的問題,需要的朋友可以參考下
    2023-09-09
  • java中Integer包裝類裝箱的一個(gè)細(xì)節(jié)詳解

    java中Integer包裝類裝箱的一個(gè)細(xì)節(jié)詳解

    Java中的Integer是int的包裝類型,下面這篇文章主要給大家介紹了關(guān)于java中Integer包裝類裝箱的一個(gè)細(xì)節(jié)的相關(guān)資料,文中介紹的這個(gè)細(xì)節(jié)挺重要的,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧
    2018-07-07
  • Java注解之Elasticsearch的案例詳解

    Java注解之Elasticsearch的案例詳解

    學(xué)會(huì)了技術(shù)就要使用,否則很容易忘記,因?yàn)樽匀唤鐗焊筒淮嬖谑裁创a、變量之類的玩意,這都是一些和生活常識(shí)格格不入的東西。這篇文章主要介紹了Java中Elasticsearch的案例,感興趣的可以了解一下
    2022-10-10
  • java 中ThreadLocal本地線程和同步機(jī)制的比較

    java 中ThreadLocal本地線程和同步機(jī)制的比較

    這篇文章主要介紹了java 中ThreadLocal本地線程和同步機(jī)制的比較的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java Synchronize下的volatile關(guān)鍵字詳解

    Java Synchronize下的volatile關(guān)鍵字詳解

    這篇文章主要介紹了Java Synchronize下的volatile關(guān)鍵字詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java泛型之上界下界通配符詳解

    Java泛型之上界下界通配符詳解

    這篇文章主要介紹了Java泛型之上界下界通配符詳解,學(xué)習(xí)使用泛型編程時(shí),更令人困惑的一個(gè)方面是確定何時(shí)使用上限有界通配符以及何時(shí)使用下限有界通配符。本文提供一些設(shè)計(jì)代碼時(shí)要遵循的一些準(zhǔn)則。,需要的朋友可以參考下
    2019-06-06

最新評(píng)論