Mybatis 延遲加載的實現原理詳細解析

Mybatis 延遲加載的實現原理詳細解析

(1)代理對象機制的深入探討
代理對象的生成:Mybatis 使用代理對象來實現延遲加載是基于 Java 的代理機制。當開啟延遲加載并且配置正確后,對于需要延遲加載的關聯對象,Mybatis 會創建一個代理對象。這個代理對象是在運行時動態生成的,它的生成過程涉及到 Java 的反射機制。以 Java 動態代理為例,Mybatis 會實現一個InvocationHandler接口,在這個接口的invoke方法中,會處理對代理對象方法的調用。
方法攔截原理:當外部代碼調用代理對象的方法時,實際上是調用了InvocationHandler接口的invoke方法。在invoke方法中,代理對象會首先檢查關聯對象是否已經被加載。這個檢查過程是通過判斷一個標志位或者查看緩存來實現的。如果關聯對象還沒有被加載,代理對象就會觸發加載過程。例如,假設代理對象是一個List類型的關聯對象的代理(如前面提到的商品圖片集合),當調用list.size()方法時,invoke方法會檢測到如果關聯對象(真實的商品圖片列表)還沒有被加載,就會執行加載操作。
代理對象與真實對象的替換:在關聯對象加載完成后,代理對象會將自己替換為真實的對象。這個替換過程需要考慮到對象的類型兼容性和引用一致性。例如,在 Java 中,如果代理對象是ArrayList的代理,加載完成后的真實對象也是ArrayList,那么代理對象會將自己在內存中的引用替換為真實的ArrayList對象的引用。這樣,在后續的方法調用中,就可以直接使用真實對象,而不會再經過代理對象的攔截。
(2)加載過程的詳細步驟
查詢語句的構建與執行:當代理對象檢測到需要加載關聯對象時,它會根據在映射文件中配置的信息構建查詢語句。這個過程涉及到解析select屬性指定的查詢方法以及column屬性指定的參數。以之前的商品和商品圖片的例子來說,代理對象會從ProductImageMapper.getProductImagesByProductId這個方法簽名和product_id這個參數構建出一個完整的 SQL 查詢語句,然后通過 Mybatis 的SqlSession對象執行這個查詢語句。在執行查詢語句時,Mybatis 會使用配置好的數據源、數據庫驅動等組件,將 SQL 語句發送到數據庫服務器進行查詢。
數據的映射與填充:數據庫返回查詢結果后,Mybatis 會根據結果集和實體類的映射關系(通常在resultMap中定義)將數據填充到關聯對象中。這個映射過程類似于普通的查詢結果映射,但在延遲加載場景下,需要將數據填充到之前未加載的關聯對象中。例如,對于商品圖片的查詢結果,Mybatis 會根據ProductImage實體類的屬性和結果集的列名、列值的對應關系,將數據逐一填充到ProductImage對象中,然后將這些對象添加到關聯對象(如productImages集合)中。
加載過程中的異常處理:在加載過程中,可能會出現各種異常情況,如數據庫連接失敗、SQL 語法錯誤、查詢結果為空等。Mybatis 會對這些異常進行處理。如果是數據庫連接失敗等嚴重錯誤,會將異常向上拋出,可能導致整個操作失敗。如果是查詢結果為空,會根據具體的配置和業務需求進行處理,可能是返回一個空的關聯對象(如空集合),也可能是拋出一個輕微的警告信息。
(3)緩存機制在延遲加載中的作用
一級緩存的影響:Mybatis 的一級緩存是基于SqlSession的緩存。在延遲加載場景下,當一個SqlSession內首次加載關聯對象后,數據可能會被緩存到一級緩存中。如果在同一個SqlSession內再次訪問相同的關聯對象,就可以直接從緩存中獲取數據,而不需要再次執行查詢語句。例如,在一個事務處理過程中,第一次加載了商品的圖片關聯對象,之后在同一事務(同一個SqlSession)中再次訪問商品圖片時,就可以利用一級緩存提高性能。
二級緩存的作用(如果啟用):二級緩存是基于Mapper的緩存,范圍比一級緩存更廣。如果在配置中啟用了二級緩存,并且關聯對象的查詢符合二級緩存的規則,那么在不同的SqlSession之間也可以共享緩存數據。這對于頻繁訪問的關聯對象來說,可以大大減少數據庫查詢次數。不過,在使用二級緩存時,需要注意緩存的一致性問題,因為不同的SqlSession可能會對數據進行修改,導致緩存數據與數據庫中的實際數據不一致。在延遲加載場景下,二級緩存的更新策略和緩存清除機制需要謹慎設計,以確保緩存數據的準確性和及時性。
————————————————

? ? ? ? ? ? ? ? ? ? ? ? ? ? 版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
? ? ? ? ? ? ? ? ? ? ? ??
原文鏈接:https://blog.csdn.net/aaaa_1111111/article/details/144152482

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62375.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024 亞馬遜云科技re:Invent:Werner Vogels架構哲學,大道至簡 六大經驗助力架構優化

在2024亞馬遜云科技re:Invent全球大會第四天的主題演講中,亞馬遜副總裁兼CTO Dr.Werner Vogels分享了 The Way of Simplexity,繁簡之道,濃縮了Werner在亞馬遜20年構建架構的經驗。 Werner表示,復雜性總是會“悄無聲息”地滲透進來…

Java Web 開發學習中:過濾器與 Ajax 異步請求

一、過濾器 Filter: 過濾器的概念與用途 在一個龐大的 Web 應用中,有許多資源需要受到保護或進行特定的預處理。過濾器就像是一位智能的守衛,站在資源的入口處,根據預先設定的規則,決定哪些請求可以順利訪問資源&…

ThinkPHP框架審計--基礎

基礎入門 搭建好thinkphp 查看版本方法,全局搜version 根據開發手冊可以大致了解該框架的路由 例如訪問url http://127.0.0.1:8094/index.php/index/index/index 對應代碼位置 例如在代碼下面添加新方法 那么訪問這個方法的url就是 http://127.0.0.1:8094/index.…

淺談Python庫之?Requests

一、?Requests的介紹 Requests 是一個簡單易用的 HTTP 庫,用于發送各種 HTTP 請求。它由 Kenneth Reitz 創建,并廣泛用于 Python 社區中。 二、?Requests的特點 1、人性化的 API:簡潔的接口使得編寫請求代碼變得簡單直觀。 2、跨平臺&…

如何在vue中使用ECharts

一. 打開ECharts官網,點擊快速入門 下面是ECharts官網的鏈接 https://echarts.apache.org/ 二.在vue中使用 1.首先先引入Echarts js文件 如下圖,下面的第一張圖片是官網的實現,第二章圖片是我根據官網的實現 2.給ECharts 創建一個DOM容器 3. 使用ec…

網絡原理之 IP 協議

目錄 1. IP 協議報文格式 2. 網段劃分 3. 地址管理 1) 動態分配 2) NAT 機制 (網絡地址轉換) 3) IPv6 4. 路由選擇 1. IP 協議報文格式 IP 協議是網絡層的重點協議。 網絡層要做的事情,主要就是兩方面: 1) 地址管理 制定一系列的規則&#xff…

HyperMesh CFD功能詳解:后處理功能Part 2

Clips Clips 按鈕包含兩個工具。Box Clip用于空間上的裁剪,Scalar Clip可以根據物理量的范圍裁剪。 示例:Box Clips 裁剪 示例:Scalar Clips 裁剪 通過裁剪,僅顯示density范圍是10~20的等值面 示例:顯示效果控制 部分透…

Java項目實戰II基于微信小程序的跑腿系統(開發文檔+數據庫+源碼)

目錄 一、前言 二、技術介紹 三、系統實現 四、核心代碼 五、源碼獲取 全棧碼農以及畢業設計實戰開發,CSDN平臺Java領域新星創作者,專注于大學生項目實戰開發、講解和畢業答疑輔導。獲取源碼聯系方式請查看文末 一、前言 在快節奏的現代生活中&…

【機器學習與數據挖掘實戰案例01】基于支持向量回歸的市財政收入分析

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?機器學習與數據挖掘實戰 ? ? ? 機器學習是人工智能的一個分支,專注于讓計算機系統通過數據學習和改進。它利用統計和計算方法,使模型能夠從數據中自動提取特征并做出預測或決策。數據挖掘則是從大型數…

windows下nacos啟動報錯:java.lang.unsatisfiedLinkError: C:\USers\亂碼AppData\xxx.dll

問題 看了許多別的帖子,大家都是因為缺少dll包,下載安裝 Microsoft Visual C 2015 Redistributable 就可以。但我試過了不行。思來想去,之前正常的時候用的JDK版本是17,后面別的項目用1.8給切換回來了。然后嘗試配置環境變量將JD…

JavaEE 【知識改變命運】03 多線程(3)

文章目錄 多線程帶來的風險-線程安全線程不安全的舉例分析產出線程安全的原因:1.線程是搶占式的2. 多線程修改同一個變量(程序的要求)3. 原子性4. 內存可見性5. 指令重排序 總結線程安全問題產生的原因解決線程安全問題1. synchronized關鍵字…

并發在前端中的應用?

?并發在前端中的應用主要體現在處理多個請求和優化頁面加載速度方面?。前端并發處理通常涉及在極短時間內發送多個數據請求,例如在頁面渲染時同時請求多個數據。通過并發處理,可以顯著減少頁面加載時間,提升用戶體驗。 前端并發處理的具體…

【力扣】409.最長回文串

問題描述 思路解析 因為同時包含大小寫字母,直接創建個ASCII表大小的桶來標記又因為是要回文子串,所以偶數個數的一定可以那么同時,對于出現奇數次數的,我沒需要他們的次數-1,變為偶數,并且可以標記出現過…

計算機視覺在科學研究(數字化)中的實際應用

計算機視覺是一種利用計算機技術來解析和理解圖像和視頻的方法。.隨著計算機技術的不斷發展,計算機視覺被廣泛應用于科學研究領域,為科學家提供了無限的可能。 一、生命科學領域 在生命科學領域,計算機視覺被廣泛用于圖像識別、分類和測量等…

springboot381銀行客戶管理系統(論文+源碼)_kaic

摘 要 伴隨著信息技術與互聯網技術的不斷發展,人們進到了一個新的信息化時代,傳統管理技術性沒法高效率、容易地管理信息內容。為了實現時代的發展必須,提升管理高效率,各種各樣管理管理體系應時而生,各個領域陸續進到…

JMX 組件架構即詳解

JMX架構由三個主要組件構成: ?MBeans(Managed Beans)?:代表可管理的資源,是JMX的核心。MBean可以是Java類或接口,提供了管理操作的接口,如獲取系統信息、設置參數等。?MBeanServer?&#x…

LLMs之ICL:《Bayesian scaling laws for in-context learning》翻譯與解讀

LLMs之ICL:《Bayesian scaling laws for in-context learning》翻譯與解讀 導讀:這篇論文的核心議題是理解和建模大型語言模型(LLM)的上下文學習(ICL)能力。文章從貝葉斯學習的角度出發,提出了一…

基于單片機和測頻法的頻率計設計及proteus仿真

摘要: 傳感器廣泛應用在自動化測量中,該文利用 51 單片機 2 個 16 位定時器和測量頻率中的測頻法設計了測量方波的頻率計,并用LCD1602 液晶顯示頻率、 proteus 仿真,測試結果表明設計思路正確、誤差小。 關鍵詞: 單片機;測頻法;頻率計; proteus 1 概述 傳感器能感受到…

軟件漏洞印象

軟件漏洞印象 軟件安全性檢測 軟件安全靜態分析:學術界一度十分熱衷的偏理論性方法軟件漏洞動態挖掘,工程界普遍采用動態漏洞挖掘方式,即Fuzz技術,也稱為模糊測試 漏洞利用 vs. 漏洞修復 對于已發現的軟件漏洞 黑客會基于Meta…

計算機網絡 —— HTTPS 協議

前一篇文章:計算機網絡 —— HTTP 協議(詳解)-CSDN博客 目錄 前言 一、HTTPS 協議簡介 二、HTTPS 工作過程 1.對稱加密 2.非對稱加密 3.中間人攻擊 4.引入證書 三、HTTPS 常見問題 1.中間人能否篡改證書? 2.中間人能否調…