Mybatis的快取機制

2021-09-25 07:47:44 字數 1641 閱讀 5907

前言:

在了解mybatis的快取之前我們先了解下mybatis的幾個核心概念

sqlsession:代表著和資料庫的一次對話,向使用者提供資料庫的方法

mybatis的快取分為一級快取和二級快取。

mybatis的預設情況下是開啟一級快取,一級快取的引用範圍是在同乙個sqlsession上。在引數和sql相同的情況下,第一次         的查詢結果後會儲存到快取中,當我們使用同乙個sqlsession呼叫同乙個介面的情況下,會根據sql和引數去快取中獲取數           據。如果存在的情況下,將不會去資料庫中訪問資料。這樣降低了資料庫的請求壓力。

如何驗證是否有一級快取

開啟mybatis的showsql的情況下,執行相同的一段**。

如果只出現了一次sql查詢,這樣就證明從一級快取中獲取資料了。

一級快取的生命週期

1. 乙個sqlsession物件中擁有乙個新的executor物件

2.乙個executor物件擁有乙個perpetualcache物件

3.呼叫sqlsession的close方法,excecutor物件和perpetualcache物件全部銷毀不可用

4.呼叫sqlsession的closecache方法,perpetualcche物件的資料清空。物件可用

5.sqlsession執行update,insert,delete方法的時候,清空快取資料,物件可用。

sqlsession查詢的時序圖

整個流程是這樣的:

* 針對某個查詢的statement,生成唯一的key

* 在local cache 中根據key查詢資料是否存在

* 如果存在,則命中,跳過資料庫查詢,繼續往下走

* 如果沒命中:

* 去資料庫中查詢,得到查詢結果

* 將key和查詢結果放到local cache中

* 將查詢結果返回

* 判斷是否是statement級別快取,如果是,則清除快取

總結一級快取:

1. 一級快取預設開啟,

2. 作用在sqlsession物件上,

3. 儲存在sqlsession->executor執行器->perpetualcache物件裡

4. 可能會出現髒資料查詢。(a sqlsession 查詢之後進行快取,b sqlsession 進行update,a sqlsession 再次查詢的資料          為 b 提交之前的資料。快取不會更新)

開啟二級快取的要求:

1.mybatis返回的pojo物件必須是可序列化的。

2.查詢使用頻率較多的情況下。

二級快取的規則

1.對映語句中的所有檔案select語句全部會被快取

2.對映語句中的所有檔案update,delete,insert全部將清空快取

3.使用lru(最長未使用原則)來進行**快取(另外幾個快取演算法,lfu 最少使用原則,fifo 先進先出原則)

開啟二級快取的方法

總結:

3.用二級快取還不如使用redis,membercache 等 記憶體資料庫。

mybatis快取機制

mybatis和hibernate一樣,也提供了一二級快取。若存在一二級快取,則資料不會去資料庫互動,而是去記憶體中獲取。一級快取是sqlsession級別的快取。在運算元據庫時需要構造sqlsession物件,在物件中有乙個資料結構 一般來說是hashmap 來儲存快取資料。不同的sqlsessi...

MyBatis 快取機制

mybatis 提供了查詢快取來獲取資料,以提高查詢的效能。mybatis 的快取分為一級快取和二級快取。1 一級快取一級快取是 sqlsession 級別的快取,是基於 hashmap 的本地快取。不同的 sqlsession 之間的快取資料區域互不影響。當同乙個 sqlsession 執行兩次相...

Mybatis 快取機制

查詢快取主要是為了提高查詢訪問速度,即當使用者執行一次查詢後,會將該資料結果放到快取中,當下次再執行此查詢時就不會訪問資料庫了而是直接從快取中獲取該資料。如果在快取中找到了資料那叫做命中。同一sqlsession 多次查詢同一sql時會使用快取 test public void testlocalc...