1. 程式人生 > 程式設計 >Mybatis 快取原理及失效情況解析

Mybatis 快取原理及失效情況解析

這篇文章主要介紹了Mybatis 快取原理及失效情況解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1、什麼是快取[Cache]

  • 存在記憶體中的臨時資料。
  • 將使用者經常查詢的資料放在快取(記憶體)中,使用者去查詢資料就不用從磁碟上(關係型資料庫資料檔案)查詢,從快取中查詢,從而提高查詢效率,解決了高併發系統的效能問題。

2、為什麼要使用快取

減少和資料庫的互動次數,減少系統開銷,提高系統效率。

3、什麼樣的資料需要使用快取

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

4、Mybatis快取

  • MyBatis包含一個非常強大的查詢快取特性,它可以非常方便地定製和配置快取。快取可以極大的提升查詢效率。
  • MyBatis系統中預設定義了兩級快取:一級快取和二級快取
    • 預設情況下,只有一級快取開啟。(SqlSession級別的快取,也稱為本地快取)
    • 二級快取需要手動開啟和配置,他是基於namespace級別的快取。
    • 為了提高擴充套件性,MyBatis定義了快取介面Cache。我們可以通過實現Cache介面來自定義二級快取

5、一級快取

一級快取也叫本地快取:

  • 與資料庫同一次會話期間查詢到的資料會放在本地快取中。
  • 以後如果需要獲取相同的資料,直接從快取中拿,沒必須再去查詢資料庫;

6、一級快取失效的四種情況

  • sqlSession不同
  • sqlSession相同,查詢條件不同
  • sqlSession相同,兩次查詢之間執行了增刪改操作!
  • sqlSession相同,手動清除一級快取
@Test
public void testQueryUserById(){
  SqlSession session = MybatisUtils.getSession();
  UserMapper mapper = session.getMapper(UserMapper.class);
  User user = mapper.queryUserById(1);
  System.out.println(user);
  session.clearCache();//手動清除快取
  User user2 = mapper.queryUserById(1);
  System.out.println(user2);
  System.out.println(user==user2);
  session.close();
}

所以說,一級快取就是一個map

7、二級快取

  • 二級快取也叫全域性快取,一級快取作用域太低了,所以誕生了二級快取
  • 基於namespace級別的快取,一個名稱空間,對應一個二級快取;
  • 工作機制
    • 一個會話查詢一條資料,這個資料就會被放在當前會話的一級快取中;
    • 如果當前會話關閉了,這個會話對應的一級快取就沒了;但是我們想要的是,會話關閉了,一級快取中的資料被儲存到二級快取中;
    • 新的會話查詢資訊,就可以從二級快取中獲取內容;
    • 不同的mapper查出的資料會放在自己對應的快取(map)中;

使用步驟:

核心配置檔案

<setting name="cacheEnabled" value="true"/>

去每個mapper.xml中配置使用二級快取,這個配置非常簡單;

方式一:

<cache/>

方式二:

<cache
 eviction="FIFO"
 flushInterval="60000"
 size="512"
 readOnly="true"/>

這個更高階的配置建立了一個 FIFO 快取,每隔 60 秒重新整理,最多可以儲存結果物件或列表的 512 個引用,而且返回的物件被認為是隻讀的,因此對它們進行修改可能會在不同執行緒中的呼叫者產生衝突。

8、結論

只要開啟了二級快取,我們在同一個Mapper中的查詢,可以在二級快取中拿到資料

查出的資料都會被預設先放在一級快取中

只有會話提交或者關閉以後,一級快取中的資料才會轉到二級快取中

原理圖:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。