MyBatis之快取(一級快取 二級快取)

2021-08-01 00:08:51 字數 2055 閱讀 5555

1,        mybatis的解析

mybatis的解析工作由xmlconfigurabuilder類來實現的,它將mybatis的所有配置資訊解析到configuration中,為之後的使用提供支援。

2,        mybatis的一級快取

mybatis的一級快取是sqlsession級別的快取,每個sqlsession都有乙個以及快取。

我們在對資料庫進行操作時,會建立乙個sqlsession,而具體的操作都交給了executor執行器來實現的,sqlsession只是mybatis對外提供的介面,executor內部維護了乙個cache物件,是實現類perpectualcache例項,cache物件儲存了query查詢的cachekey和查詢結果的對映。cachekey是由statementid、rowbounds、原始sql語句以及引數生成。

當我們執行查詢時,首先通過構造cachekey,去cache中查詢是否快取了結果,有則直接返回,沒有再去資料庫中差,然後將結果儲存到cache中再返回。

一級快取實際上是使用perpetualcache來維護的,其內部是通過乙個hashmap來實現的

3,        mybatis的二級快取

1,        mybatis自身提供的快取實現

2,        使用者自定義的cache介面實現

3,        跟第三方記憶體快取庫的整合,比如encache!

開啟二級快取需要三步:

1,        mybatis全域性配置檔案中將cacheenable設定為true;

3,        具體的select的statement配置中設定usecache為true

mybatis的二級快取其實是通過對executor來實現的。使用二級快取時,sqlsession建立executor物件時,會為executor物件加上乙個裝飾者:cachingexecutor,其實就是建立乙個cachingexecutor物件,它是executor的裝飾者,設計模式之裝飾模式自己下去看!當進行查詢時,首先cachingexecutor先在二級快取中查詢,找到則直接返回,沒有找到再讓真正的executor去執行它的操作(一級快取和資料庫查詢),最後cachingexecutor會把executor的返回結果放到快取中,然後再返回。

對於mybatis自身提供的快取實現,mybatis定義了大量的cache的裝飾器來增強cache快取的功能,對於每個cache而言,都提供了容量限制,通常採用lru、fifo、scheduled來對快取進行清除。

4,        mybatis的二級快取帶來的問題

解決:2,        某些表執行更新操作後,去清空跟這些表有關聯的查詢語句造成的快取。決定清空哪些查詢快取,是在enhancedcachingmanager中維護的:update型別的statementid和select型別的statementid集合的對映!

針對2的解決,可以使用enhanced-cache(加強的快取)外掛程式,enhanced-cache外掛程式由兩個構建組成:enhancedcachingexecutor、enhancedcachingmanager。

enhancedcachingexecutor,其實就是乙個針對executor的***,攔截executor的query和update操作,

1,        當executor執行query操作時

1.1   記錄下該查詢的statementid和cachekey,將其新增到enhancedcachingmanager中

2,        當executor執行update操作時,將update操作的statementid傳遞給enhancedcachingmanager,讓它根據statementid的配置,去清空指定的查詢語句所產生的快取。

enhancedcachingmanager,它維護著一下幾樣東西:

1,        整個mybatis的所有查詢所產生的cachekey集合

2,        所有statementid及其對應的cache快取物件的引用

3,        update型別的statementid和select型別的statementid集合的對映,用於當執行update操作時,根據此對映決定清空的查詢快取。

mybatis快取 一級快取,二級快取

什麼是快取 為什麼使用快取 適用於快取的資料 二級快取的使用步驟 在主配置檔案配置 name cacheenabled value ture 讓當前的操作支援快取 在對映檔案中 select 標籤中配置 在select標籤中 新增乙個屬性 userscache true 先建立出乙個sqlsessi...

Mybatis快取(一級快取 二級快取)

mybatis快取分為一級快取 二級快取。mybatis一級快取預設是開啟的 二級快取全域性開關預設也是開啟的,但需要配置cachenamespace才可生效!以mybatis plus為例 mybatis plus configuration log impl org.apache.ibatis....

mybatis一級快取

autowired private sqlsessionfactory sqlsessionfactory autowired test transactional public void test selectall.size log.info 第2次查詢 selectall2.size 同乙個s...