【Java】MyBatis緩存機制

1.一級緩存|二級緩存

  1. 一級緩存:
  • 是指當使用SqlSession從數據庫中取數據時,Executor會在優先查找本地緩存中的數據,如果命中緩存,則直接返回本地緩衝區中的數據,否則會從數據庫中進行查找,查找結果緩存到本地的同時,發送給SqlSession。
  • 當第二次查詢SQL語句相同時,會直接從本地緩存中拿取數據。session級別的一級緩存是靠PerpetualCache(內部原理HashMap<K, V>)實現的。
  1. 二級緩存:
  • 二級緩存利用設計模式中的裝飾者模式得到一個CachingExecutor,CachingExecutor是Executor的實現類。其拿取數據流程和一級緩存類似。
  • 不同的是二級緩存是應用級別的緩存,如果緩存數據較多的話,它可以將緩存內容存放至第三方數據庫中,如MemCached、Redis等。

在這裏插入圖片描述

2.一級緩存性能分析

  • MyBatis對會話(Session)級別的一級緩存設計的比較簡單,就簡單地使用了HashMap來維護,並沒有對HashMap的容量和大小進行限制。
  • 一級緩存是一個粗粒度的緩存,沒有更新緩存和緩存過期的概念。

3.MyBatis緩存級別

  • MyBatis一級緩存有兩種級別:SESSION級別、STATEMENT級別
  • MyBatis二級緩存級別是mapper級別的緩存,不同的mapper通常情況下有不同的namespace,也就都對應一個二級緩存。不同的mapper之間不會互相影響。需要注意的是,如果緩存的內容是查詢數據庫的結果,則當進行下一次增刪改操作時,緩存會被刷新,從而保證數據的一致性。

4.一級緩存的使用

  1. 開啓一級緩存
  • SESSION級別:
    <settings>
        <setting name="localCacheScope" value="SESSION"/>
    </settings>
  • STATEMENT級別:
    <settings>
        <setting name="localCacheScope" value="STATEMENT"/>
    </settings>

	<select id="selectAll" resultMap="BaseResult" useCache="true">
        select * from tb_user
    </select>

    <!-- 
		useCache - 使用緩存
		flushCache - 執行完是否清除緩存
     -->
  1. 執行後打印的日誌結果
    在這裏插入圖片描述

5.二級緩存的使用

  1. 設置cacheEnabled,開啓二級緩存
    <settings>
        <!--配置一級緩存(默認開啓),共有兩個選項,SESSION或者STATEMENT,默認是SESSION級別,
            即在一個MyBatis會話中執行的所有語句,都會共享這一個緩存。一種是STATEMENT級別,
            可以理解爲緩存只對當前執行的這一個Statement有效。-->
        <setting name="localCacheScope" value="SESSION"/>
        <!-- 指定所用日誌的具體實現,未指定時將自動查找 [STDOUT_LOGGING]-MyBatis日誌 -->
        <setting name="logImpl" value="LOG4J"/>
        <!--開啓二級緩存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
  1. mapper中開啓默認緩存,只需寫上cache標籤即可。
    <mapper>
        <!--配置默認緩存-->
   		 <cache></cache>
   </mapper>
  1. 查看結果
    在這裏插入圖片描述
發佈了73 篇原創文章 · 獲贊 282 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章