前言
看過無數資料,背過無數面試題,我們都知道了mybatis的一級緩存是sqlSession,二級緩存是namespace,但是mybatis對於緩存到底是怎麼實現的,怎麼處理的呢,我想不少人其實都是一頭霧水。今天,就讓我們一起來看看,這背後的原理。
一、核心類圖
二、代碼實現:
第一步:
第二步:看看執行器獲取邏輯
第三步:分析執行器simpleExcutor
SimpleExcutor的query方法來自於父類BaseExcutor
那麼這裏的localCache到底是什麼呢?
那麼爲啥說一級緩存是sqlSession,而且它和線程綁定?
首先,我們sqlSession持有一個Excutor對象,而excutor對象持有一個PerpetualCache對象,也就是我們的實際存儲對象。然後再看看Excutor在提交後會做什麼?
對的,清空緩存,那麼一旦我們的事務提交,緩存立即清空,也就是說它和當前用戶請求線程綁定
第四步:分析執行器cacheExcutor
再看看這個cache哪裏來的,我一路追蹤,發現其最終實現在MapperBuilderAssistant類的useCacheRef和useNewCache方法