第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

二級緩存的過程

問下為啥第一次查詢后,返回的結(jié)果只寫入了一級緩存,返回給客戶端。二級緩存沒寫入呢

正在回答

4 回答

  • sqlSession關(guān)閉時才創(chuàng)建二級緩存?

  • sqlSession提交時才創(chuàng)建二級緩存


0 回復 有任何疑惑可以回復我~


Mybatis Cache

一級緩存特點

  1. 自動啟用

  • 通過在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、有臟讀問題,建議直接不用)

  1. 啟用步驟:

  • 在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;


1 回復 有任何疑惑可以回復我~

第一次查詢的session要提交或關(guān)閉才會把數(shù)據(jù)寫入??梢钥碩ransactionalCache類的實現(xiàn)


1 回復 有任何疑惑可以回復我~

存一份就好了,為啥要存兩份呢?不就冗余了嗎

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

二級緩存的過程

我要回答 關(guān)注問題
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號