課程
/后端開發(fā)
/Java
/Mybatis緩存詳解
問下為啥第一次查詢后,返回的結(jié)果只寫入了一級緩存,返回給客戶端。二級緩存沒寫入呢
2020-06-14
源自:Mybatis緩存詳解 5-1
正在回答
sqlSession關(guān)閉時才創(chuàng)建二級緩存?
sqlSession提交時才創(chuàng)建二級緩存
自動啟用
通過在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ù)被另外事務修改并提交后,仍會從緩存中讀到舊數(shù)據(jù)(錯誤),實際是避免了事務不可重復讀問題), Mybatis 一級緩存是在事務的生命周期之內(nèi)的,在關(guān)閉session、執(zhí)行commit、執(zhí)行rollback都會清空Mybatis一級緩存。 實際上Mybatis 一級緩存反而避免了數(shù)據(jù)庫事務中的臟讀(讀未提交)、不可重復讀(讀提交)問題。
源碼解讀
代理模式與裝飾模式的區(qū)別:代理模式在無參構(gòu)造方法中確定地new了一個被代理的對象,編譯時已經(jīng)可以確定;而裝飾模式是通過有參構(gòu)造方法將被裝飾對象傳入裝飾 類中,能夠在運行時遞歸地被構(gòu)造。
設(shè)計理念:在一個session內(nèi),不過期、不更新、不限制;
與spring整合時,如果開啟了事務,事務內(nèi),Spring通過ThreadLocal始終使用同一個sqlSession,一級緩存生效; 如果沒有開啟事務,每次查詢前會創(chuàng)建一個sqlSession,查詢結(jié)束后會關(guān)閉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ù)要一樣?
條件四: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;
第一次查詢的session要提交或關(guān)閉才會把數(shù)據(jù)寫入??梢钥碩ransactionalCache類的實現(xiàn)
存一份就好了,為啥要存兩份呢?不就冗余了嗎
舉報
學習mybatis一級緩存、二級緩存及自定義緩存的使用
2 回答一級緩存和二級緩存,對象不相等?
1 回答二級緩存臟讀問題
2 回答一級緩存讀取的數(shù)據(jù)不對??
1 回答一級緩存是否真的有意義
3 回答mybatis 就是默認開啟一級緩存的是吧
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學習伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2022-04-25
sqlSession關(guān)閉時才創(chuàng)建二級緩存?
sqlSession提交時才創(chuàng)建二級緩存
2022-04-25
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ù)被另外事務修改并提交后,仍會從緩存中讀到舊數(shù)據(jù)(錯誤),實際是避免了事務不可重復讀問題), Mybatis 一級緩存是在事務的生命周期之內(nèi)的,在關(guān)閉session、執(zhí)行commit、執(zhí)行rollback都會清空Mybatis一級緩存。 實際上Mybatis 一級緩存反而避免了數(shù)據(jù)庫事務中的臟讀(讀未提交)、不可重復讀(讀提交)問題。
源碼解讀
代理模式與裝飾模式的區(qū)別:代理模式在無參構(gòu)造方法中確定地new了一個被代理的對象,編譯時已經(jīng)可以確定;而裝飾模式是通過有參構(gòu)造方法將被裝飾對象傳入裝飾 類中,能夠在運行時遞歸地被構(gòu)造。
設(shè)計理念:在一個session內(nèi),不過期、不更新、不限制;
與spring整合時,如果開啟了事務,事務內(nèi),Spring通過ThreadLocal始終使用同一個sqlSession,一級緩存生效; 如果沒有開啟事務,每次查詢前會創(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;
2020-06-26
第一次查詢的session要提交或關(guān)閉才會把數(shù)據(jù)寫入??梢钥碩ransactionalCache類的實現(xiàn)
2020-06-25
存一份就好了,為啥要存兩份呢?不就冗余了嗎