1. 程式人生 > 實用技巧 >Mybatis-09-快取

Mybatis-09-快取

快取

  1. 什麼是快取[Cache]?
    • 存在記憶體中的臨時資料
    • 提高查詢效率,解決高併發的效能問題
  2. 為什麼使用快取?

    • 減少和資料庫的互動次數,減少系統開銷,提高系統效率
  3. 什麼樣的資料能使用快取?

    • 經常查詢且不常改變的資料

1 Mybatis快取

  • 可以定製和配置快取。
  • 預設定義了兩極快取:一級快取和二級快取
    • 預設情況下,只有一級快取開啟(SqlSession級別的快取)
    • 二級快取需要手動開啟和配置,是基於namespace級別的快取
    • 為了提高擴充套件性,Mybatis定義了快取介面Cache。

2 一級快取

也叫本地快取:

  • 與資料庫同一次會話期間查詢到的資料會放到本地快取中
  • 以後如果需要可以直接從快取拿;

測試步驟:

  1. 開啟日誌
  2. 測試在一個session中查詢兩次相同的記錄
  3. 檢視日誌輸出

快取失效的情況:

  1. 查詢不同的東西

  2. 增刪改操作,可能會改變原來的資料,必定會重新整理快取;

  3. 查詢不同的Mapper.xml

  4. 手動清理快取!

sqlSession.closeCache();

小結:

​ 一級快取預設是開啟的,只在一次SqlSession中有效。

​ 一級快取就是一個Map

3 二級快取

  • 二級快取也叫全域性快取
  • 基於namespace級別的快取,一個名稱空間,對應一個二級快取;
  • 工作機制
    • 一個會話查詢一條資料,這個資料被放在一級快取中;
    • 會話關閉時,一級快取被清理,我們希望繪畫關閉時,一級快取的資料被儲存到二級快取;
    • 新的會話查詢資訊,可以從二級快取中獲取內容;
    • 不同的mapper查出的資料會放在自己的快取(map)中;

步驟:

  1. 開啟全域性快取
<setting name="cacheEnabled" value="true"/>
  1. 在要使用二級快取的Mapper中開啟
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
  1. 測試

    1. 問題:我們需要將實體類序列化;

小結:

  • 只要開啟了二級快取,在同一個mapper有效
  • 所有資料會先放在一級快取;
  • 只有會話提交或關閉時,才會提交到二級快取!

4 快取原理

5 自定義快取-ehcache

Ehcache是一種廣泛使用的開源Java分散式快取

第一步,先導包!

<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.1.0</version>
</dependency>

第二步,應用到Mapper的cache標籤中。

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>