<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>

          徹底告別爛代碼,讓實現(xiàn)優(yōu)雅起來!

          共 1455字,需瀏覽 3分鐘

           ·

          2021-01-04 21:09

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

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

          一級緩存

          在 MyBatis 中,Cache 是緩存接口,定義了一些基本的緩存操作,所有緩存類都應(yīng)該實現(xiàn)該接口。MyBatis 內(nèi)部提供了豐富的緩存實現(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='我要帶你飛'}



          一級緩存源碼分析

          緩存的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ù)庫數(shù)據(jù)
          }
          localCache.putObject(key,?list);//緩存存儲查詢結(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ù)庫
          }



          二級緩存

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




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


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


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


          更多課程干貨:

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

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

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

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

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

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

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

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

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

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

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

          12. 知道Bean的生命周期嗎?說說它有哪些步驟?每個步驟是用來干什么的

          13. 聽說過Spring中的后置處理器嗎?說說你的理解

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

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

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

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

          18. 能否說下ApplicationContext的啟動流程中做了哪些事情



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

          ??戳閱讀原文也可購課

          瀏覽 26
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  69操视频 | www色婷婷 | 91三级片视频 | 国产精品av在线观看 | 国产无码在线看 |