Mybatis 一級快取和二級快取原理區別 (圖文詳解)
Java面試經常問到Mybatis一級快取和二級快取,今天就給大家重點詳解Mybatis一級快取和二級快取原理與區別@
Mybatis快取
快取就是記憶體中的資料,常常來自對資料庫查詢結果的儲存,使用快取可以避免頻繁與資料庫進行互動,從而提高查詢響應速度。
MyBatis 提供了對快取的支援,分為一級快取和二級快取,如下圖所示:
我們先大致瞭解下MyBatis一級快取與MyBatis 二級快取:
一級快取:SqlSession級別的快取,快取的資料只在SqlSession內有效。
二級快取:mapper級別的快取,同一個namespace公用這一個快取,所以對SqlSession是共享的,二級快取需要我們手動開啟。
下面我們再分別詳解兩者的原理與區別。
Mybatis一級快取
1.為什麼需要Mybatis一級快取
當我們使用Mybatis進行資料庫的操作時候,會建立一個SqlSession來進行一次資料庫的會話,會話結束則關閉SqlSession物件。
如果我們很有可能多次查詢完全相同的sql語句,每一次查詢都查詢一次資料庫,那查詢資料庫代價是比較大的,這會導致系統的資源浪費。
為了解決這個問題,Mybatis對每一次會話都新增了快取操作,不用相同的SQL每次都需要查詢資料庫,這就是Mybatis一級快取的作用。
2.Mybatis一級快取的實現
我們知道對SqlSession的操作,mybatis內部都是透過Executor來執行的,Executor的生命週期和SqlSession是一致的。
Mybatis在Executor中建立了本地快取(一級快取),如下圖所示:
大致的流程如下:
第一次查詢使用者id資訊,先去快取中查詢是否有,如果沒有,從資料庫中查詢使用者資訊,得到使用者資訊後在將使用者資訊儲存到一級快取中。
如果sqlSession去執行commit操作(插入、更新、刪除),清空sqlSession中的一級快取,保證快取中始終儲存的是最新的資訊,避免髒讀。
第二次查詢使用者id資訊,先去快取中查詢,如快取中有,直接從快取中獲取。
注意:兩次查詢須在同一個sqlsession中完成,否則將不會走mybatis的一級快取。
在mybatis與spring進行整合開發時,事務控制在service中進行,重複呼叫兩次servcie將不會走一級快取,因為在第二次呼叫時session方法結束,SqlSession就關閉了。
3.Mybatis一級快取配置
mybatis一級快取的範圍有SESSION和STATEMENT兩種,預設是SESSION。
如果不想使用一級快取,可以把一級快取的範圍指定為STATEMENT,這樣每次執行完一個Mapper中的語句後都會將一級快取清除。
如果需要更改一級快取的範圍,可以在Mybatis的配置檔案中,在下透過localCacheScope指定。
<setting name="localCacheScope" value="STATEMENT"/>
Mybatis二級快取
1.為什麼需要Mybatis二級快取?
MyBatis 一級快取最大的共享範圍就是一個SqlSession內部,那麼如果多個 SqlSession 需要共享快取,則需要開啟二級快取。
2.Mybatis二級快取的實現
開啟二級快取後,會使用 CachingExecutor 裝飾 Executor,進入一級快取的查詢流程前,先在 CachingExecutor 進行二級快取的查詢,具體的工作流程如下所示。
二級快取開啟後,同一個 namespace 下的所有操作語句,都影響著同一個 Cache,即二級快取被多個 SqlSession 共享,是一個全域性的變數。
當開啟快取後,資料的查詢執行的流程就是 二級快取 -> 一級快取 -> 資料庫。
MyBatis 是預設關閉二級快取的,因為對於增刪改操作頻繁的話,那麼二級快取形同虛設,每次都會被清空快取。
Mybatis一級快取與二級快取的區別
1)一級快取 Mybatis的一級快取是指SQLSession,一級快取的作用域是SQlSession, Myabits預設開啟一級快取。
在同一個SqlSession中,執行相同的SQL查詢時;第一次會去查詢資料庫,並寫在快取中,第二次會直接從快取中取。 當執行SQL時候兩次查詢中間發生了增刪改的操作,則SQLSession的快取會被清空。
每次查詢會先去快取中找,如果找不到,再去資料庫查詢,然後把結果寫到快取中。 Mybatis的內部快取使用一個HashMap,key為hashcode+statementId+sql語句。Value為查詢出來的結果集對映成的java物件。 SqlSession執行insert、update、delete等操作commit後會清空該SQLSession快取。
2) Mybatis二級快取是預設不開啟的,作用於一個Application,是Mapper級別的,多個SqlSession使用同一個Mapper的sql能夠使用二級快取。
以上
作者簡介
陳睿|mikechen,10年+大廠架構經驗,《BAT架構技術500期》系列文章作者,分享十餘年架構經驗以及面試心得!
閱讀mikechen的網際網路架構更多技術文章合集
| | | | | | | 架構師
關注「mikechen 的網際網路架構」公眾號,回覆 【架構】領取我原創的《300 期 + BAT 架構技術系列與 1000 + 大廠面試題答案》
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011997/viewspace-2915557/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MyBatis快取機制(一級快取,二級快取)MyBatis快取
- mybatis快取-二級快取MyBatis快取
- MyBatis中的一級快取和二級快取介紹MyBatis快取
- Hibernate中一級快取和二級快取使用詳解快取
- mybatis原始碼學習:一級快取和二級快取分析MyBatis原始碼快取
- mybatis快取之一級快取(二)MyBatis快取
- Mybatis的二級快取、使用Redis做二級快取MyBatis快取Redis
- Mybatis二級快取使用MyBatis快取
- Mybatis一級快取MyBatis快取
- mybatis原始碼詳細解析(2)---- 一級,二級快取MyBatis原始碼快取
- Mybatis的快取——一級快取和原始碼分析MyBatis快取原始碼
- mybatis二級快取引數MyBatis快取
- Hibernate的一級快取Session和二級快取SessionFactory快取Session
- mybatis快取之一級快取(一)MyBatis快取
- Mybatis 二級快取應用 (21)MyBatis快取
- hibernate(九) 二級快取和事務級別詳講快取
- 被mybatis一級快取坑了MyBatis快取
- Mybatis快取詳解MyBatis快取
- 深入理解 MyBatis的二級快取的設計原理MyBatis快取
- mybatis基礎系列(四)——關聯查詢、延遲載入、一級快取與二級快取MyBatis快取
- Mybatis 一級快取和引發的問題MyBatis快取
- spring boot redis做mybatis二級快取Spring BootRedisMyBatis快取
- Hibernate一級快取(session)與二級快取(sessionFactory)的知識點。快取Session
- 【MyBatis原始碼解析】MyBatis一二級快取MyBatis原始碼快取
- MybatisPlus二級快取MyBatis快取
- Spring Boot + Mybatis + Redis二級快取例項Spring BootMyBatisRedis快取
- mybatis二級快取應用及與ehcache整合MyBatis快取
- Mybatis整合二級快取與同時使用快取與事務存在的坑MyBatis快取
- hibernate的查詢快取和二級快取的配合使用快取
- myBatis原始碼解析-二級快取的實現方式MyBatis原始碼快取
- Spring Boot + Mybatis + Redis二級快取開發指南SpringbootMyBatisRedis快取
- Laravel 實現二級快取 提高快取的命中率和細粒化快取 keyLaravel快取
- 電腦CPU二級快取的開啟方法和如何檢視二級快取的引數快取
- 快取穿透、快取擊穿、快取雪崩區別快取穿透
- Hibernate---快取機制四(一,二級快取的比較)快取
- MyBatis框架原理3:快取MyBatis框架快取
- hibernate二級快取問題!快取
- mybatis一級快取(session cache)引發的問題MyBatis快取Session