徹底告別爛代碼,讓實現(xiàn)優(yōu)雅起來!
計算機(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元,掃碼即刻搶占
開源框架Mybatis源碼如何學(xué)習(xí)?
Mybatis源碼中用到了哪些設(shè)計模式?
Mybatis如何獲取數(shù)據(jù)庫源
Mybatis如何執(zhí)行SQL語句,xml和注解的方式差異點
Mybatis結(jié)果集處理與結(jié)果映射關(guān)系源碼分析
Mybatis中緩存的作用與不足
一級和二級緩存實現(xiàn)原理,默認(rèn)先執(zhí)行是一級緩存還是二級緩存
Mybatis執(zhí)行器原理深入分析,執(zhí)行器的區(qū)別于源碼分析
Mybatis如何改寫SQL,為什么要改寫sql?
你是如何理解Spring中的IOC、DI、AOP這些概念的,說下你自己的理解
你怎么理解Spring Framework、Spring Boot、Spring Cloud之間的關(guān)系
知道Bean的生命周期嗎?說說它有哪些步驟?每個步驟是用來干什么的
聽說過Spring中的后置處理器嗎?說說你的理解
Spring事務(wù)是如何實現(xiàn)的?有哪些情況會導(dǎo)致Spring事務(wù)失效?為什么會失效
Spring中的AOP什么時候用Cglib,什么時候用JDK動態(tài)代理
知道Spring中的循環(huán)依賴嗎?如果僅僅只用二級緩存來解決,還會出現(xiàn)什么問題?
說說@Autowired、@Resource、@Value、@Inject這幾個注解的區(qū)別與底層實現(xiàn)
能否說下ApplicationContext的啟動流程中做了哪些事情

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