最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

結(jié)論

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

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

我們知道,mybatis在啟動的時候,會解析全局配置文件,會把mapper.xml文件中的一個個sql片段,解析成一個個mappedStatement對象,所以,這里二級緩存自然也就是namespace級別的

源碼

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

我們先來看一級緩存的處理

一級緩存

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

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

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

這里可以看到,在通過openSession()初始化sqlSession對象的時候,就會初始化一個executor對象

所以,我們說一級緩存是executor級別的

二級緩存

我們接著來看二級緩存的邏輯

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

可以看到這個方法的第一行,是從MappedStatement對象中獲取到的

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

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

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

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

這個方法中,會給currentCache賦值

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

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

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

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

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

所以,我們說二級緩存是namespace級別的

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

相關(guān)文章

  • springboot帶有進(jìn)度條的上傳功能完整實例

    springboot帶有進(jìn)度條的上傳功能完整實例

    這篇文章主要介紹了springboot帶有進(jìn)度條的上傳功能,結(jié)合完整實例形式分析了springboot帶進(jìn)度條上傳的原理、實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • IDEA必備開發(fā)神器之EasyCode

    IDEA必備開發(fā)神器之EasyCode

    對于java程序員來說,日常工作中就是crud的操作,每次都要搭建MVC三層,還是很繁瑣,這里就出現(xiàn)了神器easycode的工具.可以快速生成代碼.并且還可以自定義模板.需要的朋友可以參考下
    2021-05-05
  • 使用SQL保留兩位小數(shù)的實現(xiàn)方式

    使用SQL保留兩位小數(shù)的實現(xiàn)方式

    SQL中保留兩位小數(shù)有三種方法:1、使用ROUND()函數(shù)進(jìn)行四舍五入;2、使用CONVERT()函數(shù)和3、CAST()函數(shù)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,這兩種方法會截斷多余的位數(shù),ROUND()函數(shù)會保留0位,而CONVERT()和CAST()會刪除多余的0
    2024-11-11
  • Mybatis RowBounds 限制查詢條數(shù)的實現(xiàn)代碼

    Mybatis RowBounds 限制查詢條數(shù)的實現(xiàn)代碼

    Oracle 數(shù)據(jù)庫查詢增加RowBounds限制查詢條數(shù),默認(rèn)是0到1000條。下面給大家分享Mybatis RowBounds 限制查詢條數(shù)的實現(xiàn)代碼,需要的朋友參考下吧
    2016-11-11
  • 使用Java判定一個數(shù)值是否在指定的開閉區(qū)間范圍內(nèi)

    使用Java判定一個數(shù)值是否在指定的開閉區(qū)間范圍內(nèi)

    這篇文章主要給大家介紹了關(guān)于使用Java判定一個數(shù)值是否在指定的開閉區(qū)間范圍內(nèi)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-09-09
  • SpringBoot文件上傳與下載功能實現(xiàn)詳解

    SpringBoot文件上傳與下載功能實現(xiàn)詳解

    文件上傳與下載是Web應(yīng)用開發(fā)中常用的功能之一。接下來我們將討論如何在Spring?Boot的Web應(yīng)用開發(fā)中,如何實現(xiàn)文件的上傳與下載,感興趣的可以了解一下
    2022-10-10
  • 詳解Java修飾符

    詳解Java修飾符

    Java語言提供了很多修飾符,主要分為以下兩類:訪問修飾符;非訪問修飾符。修飾符用來定義類、方法或者變量,通常放在語句的最前端。我們通過下面的例子來說明,下面就跟小編一起來看下吧
    2016-12-12
  • 解析電子郵件的基本概念及JavaMail API郵件功能使用

    解析電子郵件的基本概念及JavaMail API郵件功能使用

    這篇文章主要介紹了電子郵件的基本概念及JavaMail API郵件功能使用,包括用Java來發(fā)送郵件的示例,需要的朋友可以參考下
    2016-02-02
  • Spring?Boot整合Kafka教程詳解

    Spring?Boot整合Kafka教程詳解

    這篇文章主要為大家介紹了Spring?Boot整合Kafka教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • JDBC獲取元數(shù)據(jù)demo

    JDBC獲取元數(shù)據(jù)demo

    這篇文章主要為大家介紹了JDBC獲取元數(shù)據(jù)實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評論

祥云县| 栾城县| 潞城市| 林芝县| 谷城县| 建平县| 东乡族自治县| 田林县| 昌乐县| 琼海市| 西平县| 大庆市| 西丰县| 基隆市| 绥中县| 绍兴市| 宁国市| 手机| 阳山县| 绥中县| 和田市| 大理市| 南安市| 昌宁县| 老河口市| 霍林郭勒市| 红安县| 资溪县| 松潘县| 长宁区| 武鸣县| 岚皋县| 武冈市| 延庆县| 富源县| 德兴市| 通州区| 从化市| 错那县| 江山市| 镇巴县|