-
SqlSession繼承路徑
查看全部 -
緩存比較
查看全部 -
Rediscache
查看全部 -
summary
查看全部 -
cache
查看全部 -
Mybatis Cache
一級緩存特點
自動啟用
通過在setting中設(shè)置localCacheScope= STATEMENT(默認為SESSION)全局禁用一級緩存
在Dao接口方法上添加注解:@Options(flushCache=Options.FlushCachePolicy.True),禁用這個方法的一級緩存
命中原則,同一SqlSession內(nèi),以下5個條件組成key,放入緩存中:
條件一:statementId相同
條件二:sql上用到的參數(shù)要一樣
條件三:分頁參數(shù)要一樣?
條件四:sql語句的文本要一樣
條件五:數(shù)據(jù)庫連接的environment要一樣
生命周期
產(chǎn)生:sqlSession執(zhí)行查詢方法,而不是update等
銷毀:sqlSession關(guān)閉、sqlSession提交、sqlSession回滾、sqlSession執(zhí)行update(新增、刪除、更新)后底層會執(zhí)行清除、主動清除
辟謠:Mybatis 一級緩存臟讀(數(shù)據(jù)被另外事務(wù)修改并提交后,仍會從緩存中讀到舊數(shù)據(jù)(錯誤),實際是避免了事務(wù)不可重復(fù)讀問題), Mybatis 一級緩存是在事務(wù)的生命周期之內(nèi)的,在關(guān)閉session、執(zhí)行commit、執(zhí)行rollback都會清空Mybatis一級緩存。 實際上Mybatis 一級緩存反而避免了數(shù)據(jù)庫事務(wù)中的臟讀(讀未提交)、不可重復(fù)讀(讀提交)問題。
源碼解讀
代理模式與裝飾模式的區(qū)別:代理模式在無參構(gòu)造方法中確定地new了一個被代理的對象,編譯時已經(jīng)可以確定;而裝飾模式是通過有參構(gòu)造方法將被裝飾對象傳入裝飾 類中,能夠在運行時遞歸地被構(gòu)造。
設(shè)計理念:在一個session內(nèi),不過期、不更新、不限制;
與spring整合時,如果開啟了事務(wù),事務(wù)內(nèi),Spring通過ThreadLocal始終使用同一個sqlSession,一級緩存生效; 如果沒有開啟事務(wù),每次查詢前會創(chuàng)建一個sqlSession,查詢結(jié)束后會關(guān)閉sqlSession,所以一級緩存無效;?
二級緩存特點(跨sqlSession、有臟讀問題,建議直接不用)
啟用步驟:
在mybatis.xml中settings標簽下添加;?
在mapper.xml中mapper標簽下添加:屬性eviction(LRU( 默認)、FIFO、SOFT、WEAK)和size(實例數(shù),默認不限制),通過這兩個屬性可自定義二級緩存的清除策略
在mapper.xml中mapper標簽下添加:屬性type,通過設(shè)置type可以指定使用的Cache對象,后面自定義緩存中有用到
默認地,select標簽flushCache="false" useCache="true",其他標簽flushCache="true" entity類實現(xiàn)Serializable標記類;?
命中原則,同一SqlSessionFactory內(nèi),以下5個條件組成key,放入緩存中:?
條件一:statementId相同?
條件二:sql上用到的參數(shù)要一樣?
條件三:分頁參數(shù)要一樣?
條件四:sql語句的文本要一樣?
條件五:數(shù)據(jù)庫連接的environment一樣?
生命周期?
sqlSession關(guān)閉-創(chuàng)建二級緩存、?
sqlSession提交-創(chuàng)建二級緩存、
sqlSession回滾、
sqlSession執(zhí)行update(新增、刪除、更新)、銷毀二級緩存唯方法:同一mapper.xml執(zhí)行update(新增、刪除、更新)注意:同一個表的操作要放在同一個mapper下
sqlSession主動清除
產(chǎn)生:1.能產(chǎn)生一級緩存;2.對sqlSession進行關(guān)閉或提交;?
銷毀:
源碼解讀 (MapperBuilderAssistant.class->useNewCache、XMLMapperBuilder.class->cacheElement)
緩存是存在Configuration下并且緩存使用的是PerpetualCache(非分布式),而Configuration又是在DefaultSqlSessionFactory下,所以不同的SqlSessionFactory下的緩存是相互隔離的;
通過自定義Redis緩存(實現(xiàn)Cache),將mapper下的cache指定type為自定義的類,就可以實現(xiàn)緩跨DefaultSqlSessionFactory;
查看全部 -
課程目錄
查看全部 -
mybatis一級緩存類圖。
查看全部 -
mhsql一級緩存類圖
查看全部 -
哈哈哈哈
查看全部 -
mybatis一二級緩存
查看全部 -
MyBatis
查看全部 -
MyBatis
查看全部 -
MyBatis
查看全部 -
MyBatis
查看全部 -
11
查看全部 -
二級緩存的命中原則
查看全部 -
1、修改配置文件
2、修改mapper文件
3、實體類實現(xiàn)序列化接口
查看全部 -
MyBatis與Spring繼承:一級緩存
查看全部 -
一級緩存的存儲
查看全部 -
MyBatis是怎么判斷某兩次查詢是完全相同的查詢?
條件一:要求查詢的StatementId必須相同,否則無法命中緩存,即使兩個查詢語句、參數(shù)等完全一樣。
條件二:要求傳遞給SQL的查詢參數(shù)必須相同,否則無法命中緩存
條件三:要求分頁參數(shù)必須相同,否則無法命中緩存。緩存粒度是整個分頁查詢結(jié)果,而不是結(jié)果中的每個對象。
條件四:要求傳遞給JDBC的SQL必須完全相同。
條件五:要求執(zhí)行環(huán)境必須相同。
查看全部 -
mybatis緩存比較
查看全部 -
size引用數(shù)目
緩存引用的最大數(shù)目,默認是1024
當(dāng)緩存引用達到最大數(shù)目時,按照eviction設(shè)定的策略執(zhí)行清除。
查看全部 -
eviction清除策略:
LRU:最近最少使用:移除最長時間不被使用的對象;(LinkHashMap)
FIFO:先進先出:按對象進入緩存的順序來移除它們;(LinkedList)
SOFT:軟引用:基于GC和軟引用規(guī)則移除對象;(SoftReference)
WEAK:弱引用: 基于GC和弱引用規(guī)則移除對象;(WeakReference)
查看全部
舉報