<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          緩存無(wú)處不在,一款優(yōu)秀的ORM框架更是如此!

          共 1455字,需瀏覽 3分鐘

           ·

          2021-01-04 18:48

          計(jì)算機(jī)世界中,緩存無(wú)處不在,作為一款優(yōu)秀的ORM框架,MyBatis中當(dāng)然也少不了緩存。緩存是MyBatis 中非常重要的特性。合理使用緩存能夠減少數(shù)據(jù)庫(kù) IO,顯著提升系統(tǒng)性能。

          在系統(tǒng)代碼的運(yùn)行中,我們可能會(huì)在一個(gè)數(shù)據(jù)庫(kù)會(huì)話中,執(zhí)行多次查詢條件完全相同的Sql,鑒于日常應(yīng)用的大部分場(chǎng)景都是讀多寫少,這重復(fù)的查詢會(huì)帶來(lái)一定的網(wǎng)絡(luò)開銷,同時(shí)select查詢的量比較大的話,對(duì)數(shù)據(jù)庫(kù)的性能是有比較大的影響。

          一級(jí)緩存

          在 MyBatis 中,Cache 是緩存接口,定義了一些基本的緩存操作,所有緩存類都應(yīng)該實(shí)現(xiàn)該接口。MyBatis 內(nèi)部提供了豐富的緩存實(shí)現(xiàn)類, 比如具有基本緩存功能的PerpetualCache ,具有 LRU 策略的緩存 LruCache ,以及可保證線程安全的緩存。

          SynchronizedCache 和具備阻塞功能的緩存 BlockingCache ?等。

          ?public?static?void?main(String[]?args)?throws?Exception?{
          ????????String?resource?=?"mybatis-config.xml";
          ????????InputStream?inputStream?=?Resources.getResourceAsStream(resource);
          ????????SqlSessionFactory?sqlSessionFactory?=?new?SqlSessionFactoryBuilder().build(inputStream);
          ????????SqlSession?session?=?sqlSessionFactory.openSession();
          ????????try?{
          ????????????Blog?blog?=?session.selectOne("org.mybatis.example.BlogMapper.selectBlog",?101);
          ????????????Blog?blog2?=?session.selectOne("org.mybatis.example.BlogMapper.selectBlog",?101);
          ????????????System.out.println(blog);
          ????????????System.out.println(blog2);
          ????????}?finally?{
          ????????????session.close();
          ????????}
          ????}


          效果:

          19:54:28.572?[main]?DEBUG?org.mybatis.example.BlogMapper.selectBlog?-?==>??Preparing:?select?*?from?Blog?where?id?=???
          19:54:28.593?[main]?DEBUG?org.mybatis.example.BlogMapper.selectBlog?-?==>?Parameters:?101(Integer)
          19:54:28.613?[main]?DEBUG?org.mybatis.example.BlogMapper.selectBlog?-?<==??????Total:?1
          Blog{id=101,?username='monkey',?context='我要帶你飛'}
          Blog{id=101,?username='monkey',?context='我要帶你飛'}



          一級(jí)緩存源碼分析

          緩存的key是如何生成的?

          org.apache.ibatis.executor.BaseExecutor#createCacheKey

          CacheKey?cacheKey?=?new?CacheKey();
          cacheKey.update(ms.getId());//id
          cacheKey.update(rowBounds.getOffset());//offset
          cacheKey.update(rowBounds.getLimit());//limit
          cacheKey.update(boundSql.getSql());//sql


          緩存的value生成核心源碼:

          localCache.putObject(key,?EXECUTION_PLACEHOLDER);
          try?{
          ??list?=?doQuery(ms,?parameter,?rowBounds,?resultHandler,?boundSql);//查詢數(shù)據(jù)庫(kù)數(shù)據(jù)
          }
          localCache.putObject(key,?list);//緩存存儲(chǔ)查詢結(jié)果


          緩存如何使用核心源碼:

          list?=?resultHandler?==?null???(List)?localCache.getObject(key)?:?null;//從緩存里面查詢是否存在數(shù)據(jù)
          if?(list?!=?null)?{
          ??handleLocallyCachedOutputParameters(ms,?key,?parameter,?boundSql);//不為空從緩存里面獲取
          }?else?{
          ??list?=?queryFromDatabase(ms,?parameter,?rowBounds,?resultHandler,?key,?boundSql);//else為空查詢數(shù)據(jù)庫(kù)
          }



          二級(jí)緩存

          大家都知道m(xù)ybatis是有一級(jí)和二級(jí)緩存,那二級(jí)緩存的源碼和使用又怎么玩?給大家看一個(gè)源碼類圖。




          Mybatis是目前國(guó)內(nèi)Java web開發(fā)的主流ORM框架。作為一名開發(fā)者非常有必要掌握其實(shí)現(xiàn)原理,更好地解決我們開發(fā)中遇到的問(wèn)題;同時(shí),Mybatis的架構(gòu)和源碼非常優(yōu)雅,使用了大量的設(shè)計(jì)模式實(shí)現(xiàn)解耦以及高擴(kuò)展性對(duì)其設(shè)計(jì)思想也需要深入理解


          除了Mybatis之外,與其處在同一重要位置的開源框架還有Spring。比如你是如何理解Spring中的IOC、DI、AOP這些概念的?比如你知道Bean的生命周期嗎?說(shuō)說(shuō)它有哪些步驟?每個(gè)步驟是用來(lái)干什么的......


          可能你不一定回答好這些問(wèn)題,最近聽了一節(jié)Mybatis架構(gòu)設(shè)計(jì)與Spring底層源碼分析課程。深入底層、剖析源碼,值得一學(xué),限時(shí)0.02元,掃碼即刻搶占


          更多課程干貨:

          1. 開源框架Mybatis源碼如何學(xué)習(xí)?

          2. Mybatis源碼中用到了哪些設(shè)計(jì)模式?

          3. Mybatis如何獲取數(shù)據(jù)庫(kù)源

          4. Mybatis如何執(zhí)行SQL語(yǔ)句,xml和注解的方式差異點(diǎn)

          5. Mybatis結(jié)果集處理與結(jié)果映射關(guān)系源碼分析

          6. Mybatis中緩存的作用與不足

          7. 一級(jí)和二級(jí)緩存實(shí)現(xiàn)原理,默認(rèn)先執(zhí)行是一級(jí)緩存還是二級(jí)緩存

          8. Mybatis執(zhí)行器原理深入分析,執(zhí)行器的區(qū)別于源碼分析

          9. Mybatis如何改寫SQL,為什么要改寫sql?

          10. 你是如何理解Spring中的IOC、DI、AOP這些概念的,說(shuō)下你自己的理解

          11. 你怎么理解Spring Framework、Spring Boot、Spring Cloud之間的關(guān)系

          12. 知道Bean的生命周期嗎?說(shuō)說(shuō)它有哪些步驟?每個(gè)步驟是用來(lái)干什么的

          13. 聽說(shuō)過(guò)Spring中的后置處理器嗎?說(shuō)說(shuō)你的理解

          14. Spring事務(wù)是如何實(shí)現(xiàn)的?有哪些情況會(huì)導(dǎo)致Spring事務(wù)失效?為什么會(huì)失效

          15. Spring中的AOP什么時(shí)候用Cglib,什么時(shí)候用JDK動(dòng)態(tài)代理

          16. 知道Spring中的循環(huán)依賴嗎?如果僅僅只用二級(jí)緩存來(lái)解決,還會(huì)出現(xiàn)什么問(wèn)題?

          17. 說(shuō)說(shuō)@Autowired、@Resource、@Value、@Inject這幾個(gè)注解的區(qū)別與底層實(shí)現(xiàn)

          18. 能否說(shuō)下ApplicationContext的啟動(dòng)流程中做了哪些事情



          從設(shè)計(jì)模式可以有效提升個(gè)人編碼及設(shè)計(jì)代碼的能力,提高技術(shù)能力。告別爛代碼,讓實(shí)現(xiàn)優(yōu)雅起來(lái),掃碼即可0.02元購(gòu)課,一起學(xué)習(xí)Mybatis,肝下Spring。

          ??戳閱讀原文也可購(gòu)課

          瀏覽 79
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  囯产精品久久久久 | 水蜜桃视频网站 | 激情动态图在线观看 | 日本中文字幕不卡 | 三级片中文字幕在线观看 |