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能夠使用二級緩存。
到此這篇關於Mybatis 一級緩存和二級緩存原理區別 的文章就介紹到這瞭,更多相關Mybatis 緩存內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java面試題沖刺第九天–MyBatis2
- Java經典面試題匯總:Mybatis
- 一篇文章帶你學習JAVA MyBatis底層原理
- 為什麼mybatis中的SqlSession一定要關閉
- 深層剖析java應用開發中MyBayis緩存