MyBatis源碼分析(一)——一級緩存和二級緩存

前言

看過無數資料,背過無數面試題,我們都知道了mybatis的一級緩存是sqlSession,二級緩存是namespace,但是mybatis對於緩存到底是怎麼實現的,怎麼處理的呢,我想不少人其實都是一頭霧水。今天,就讓我們一起來看看,這背後的原理。

 

一、核心類圖

二、代碼實現:

 第一步:

第二步:看看執行器獲取邏輯

 第三步:分析執行器simpleExcutor

SimpleExcutor的query方法來自於父類BaseExcutor

那麼這裏的localCache到底是什麼呢?

那麼爲啥說一級緩存是sqlSession,而且它和線程綁定?

首先,我們sqlSession持有一個Excutor對象,而excutor對象持有一個PerpetualCache對象,也就是我們的實際存儲對象。然後再看看Excutor在提交後會做什麼?

對的,清空緩存,那麼一旦我們的事務提交,緩存立即清空,也就是說它和當前用戶請求線程綁定

第四步:分析執行器cacheExcutor

再看看這個cache哪裏來的,我一路追蹤,發現其最終實現在MapperBuilderAssistant類的useCacheRef和useNewCache方法

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章