MyBatis一級緩存和二級緩存瞭解

MyBatis官網
MyBatis擁有自帶一級緩存和二級緩存

一級緩存:

MyBatis
MyBatis是默認開啓一級緩存,一級緩存是指session緩存,它的作用域是一個sqlSession對應着一個緩存空間。

當你再同一個sqlSession執行sql時,第一次會查詢數據庫,寫入到緩存中,第二次會先去緩存中獲取,沒有命中就再次查詢數據庫。
當執行增刪改的操作時,MyBatis會把SqlSession對應的緩存清空。
Spring項目中一個Mapper文件對應着一個SqlSession。

二級緩存

二級緩存是需要手動開啓

<settings>
    <!-- 開啓二級緩存 -->
    <setting name="cacheEnabled" value="true" />
</settings>

在這裏插入圖片描述
二級緩存是在一級緩存的基礎上開啓多個SqlSession對應緩存空間共享

這樣我就可以在第一個SqlSession執行一條查詢語句時會去數據庫中讀取 並存入對應的緩存空間,第二個SqlSession執行同一條查詢語句時會先去所有的SqlSession對應的緩存空間中獲取數據。

值得一提的是 當一個SqlSession執行增刪改的時候,他只會清空自己對應的緩存空間,假如第一個緩存中存儲的name叫"小明"
第二個SqlSession執行修改操作改爲name"小紅",然後執行查詢語句會命中第一個緩存中的"小明" 這就會造成髒讀。

解決辦法
如果是兩個mapper命名空間的話,可以使用 來把一個命名空間指向另外一個命名空間,從而消除上述的影響,再次執行,就可以查詢到正確的數據。

二級緩存使用注意事項

  1. 緩存是以爲單位的,不同SqlSession下的操作互不影響。
  2. insert,update,delete操作會清空所在SqlSession下的全部緩存。
  3. 通常使用MyBatis Generator生成的代碼中,都是各個表獨立的,每個表都有自己的SqlSession。
  4. 多表操作一定不要使用二級緩存,因爲多表操作進行更新操作,一定會產生髒數據。

Spring 項目中一個SqlSession等同於一個namespace。
在這裏插入圖片描述
如果你遵守二級緩存的注意事項,那麼你就可以使用二級緩存。

但是,如果不能使用多表操作,二級緩存不就可以用一級緩存來替換掉嗎?而且二級緩存是表級緩存,開銷大,沒有一級緩存直接使用 HashMap 來存儲的效率更高,所以二級緩存並不推薦使用。

參考文章
MyBatis 二級緩存全詳解

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