Mybatis 的一級緩存和二級緩存

一級緩存

在這裏插入圖片描述

1.定義

  • 一級緩存基於 sqlSession 默認開啓,在操作數據庫時需要構造 SqlSession 對象,在對象中有一個 HashMap 用於存儲緩存數據。不同的 SqlSession 之間的緩存數據區域是互相不影響的。一級緩存的作用域是 SqlSession 範圍的,當在同一個 sqlSession 中執行兩次相同的 sql 語句時,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次查詢時會從緩存中獲取數據,不再去底層數據庫查詢,從而提高查詢效率。

  • 需要注意的是,如果 SqlSession 執行了 DML 操作(增刪改),並且提交到數據庫,MyBatis 則會清空 SqlSession 中的一級緩存,這樣做的目的是爲了保證緩存中存儲的是最新的信息,避免出現髒讀現象。

  • 當一個 SqlSession 結束後該 SqlSession 中的一級緩存也就不存在了。關閉一級緩存後,再次訪問,需要再次獲取一級緩存,然後才能查找數據,否則會拋出異常。

2.一級緩存的生命週期有多長?

  • MyBatis 在開啓一個數據庫會話時,會 創建一個新的 SqlSession 對象,SqlSession 對象中會有一個新的 Executor 對象。Executor 對象中持有一個新的 PerpetualCache 對象;當會話結束時,SqlSession 對象及其內部的 Executor 對象還有 PerpetualCache 對象也一併釋放掉。

  • 如果 SqlSession 調用了 close () 方法,會釋放掉一級緩存 PerpetualCache 對象,一級緩存將不可用。

  • 如果 SqlSession 調用了 clearCache (),會清空 PerpetualCache 對象中的數據,但是該對象仍可使用。

  • SqlSession 中執行了任何一個 update 操作 (update ()、delete ()、insert ()) ,都會清空 PerpetualCache 對象的數據,但是該對象可以繼續使用


二級緩存

在這裏插入圖片描述

1.二級緩存是 mapper 級別的緩存

  • 使用二級緩存時,多個 SqlSession 使用同一個 Mapper 的 sql 語句去操作數據庫,得到的數據會存在二級緩存區域,它同樣是使用 HashMap 進行數據存儲。相比一級緩存 SqlSession,二級緩存的範圍更大,多個 Sqlsession 可以共用二級緩存,二級緩存是跨 SqlSession 的。

  • 二級緩存的作用域是 mapper 的同一個 namespace。不同的 sqlSession 兩次執行相同的 namespace 下的 sql 語句,且向 sql 中傳遞的參數也相同,即最終執行相同的 sql 語句,則第一次執行完畢會將數據庫中查詢的數據寫到緩存,第二次查詢會從緩存中獲取數據,不再去底層數據庫查詢,從而提高效率。

  • 二級緩存是 mapper 級別的緩存, 多個 SqlSession 去操作同一個 Mapper 的 sql 語句,多個 SqlSession 去操作數據庫得到數據會存在二級緩存區域,多個 SqlSession 可以共用二級緩存,二級緩存是跨 SqlSession 的。 二級緩存是多個 SqlSession 共享的,其作用域是 mapper 的同一個 namespace,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。

  • Mybatis 默認沒有開啓二級緩存需要在 setting 全局參數中配置開啓二級緩存。

  • 緩存會使用默認的 Least Recently Used(LRU,最近最少使用的)算法來收回。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章