這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)使用MyBatis如何實(shí)現(xiàn)一級(jí)緩存與二級(jí)緩存,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供廣河網(wǎng)站建設(shè)、廣河做網(wǎng)站、廣河網(wǎng)站設(shè)計(jì)、廣河網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、廣河企業(yè)網(wǎng)站模板建站服務(wù),10多年廣河做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。MyBatis緩存
我們知道,頻繁的數(shù)據(jù)庫(kù)操作是非常耗費(fèi)性能的(主要是因?yàn)閷?duì)于DB而言,數(shù)據(jù)是持久化在磁盤中的,因此查詢操作需要通過IO,IO操作速度相比內(nèi)存操作速度慢了好幾個(gè)量級(jí)),尤其是對(duì)于一些相同的查詢語(yǔ)句,完全可以把查詢結(jié)果存儲(chǔ)起來(lái),下次查詢同樣的內(nèi)容的時(shí)候直接從內(nèi)存中獲取數(shù)據(jù)即可,這樣在某些場(chǎng)景下可以大大提升查詢效率。
MyBatis的緩存分為兩種:
一級(jí)緩存,一級(jí)緩存是SqlSession級(jí)別的緩存,對(duì)于相同的查詢,會(huì)從緩存中返回結(jié)果而不是查詢數(shù)據(jù)庫(kù)
二級(jí)緩存,二級(jí)緩存是Mapper級(jí)別的緩存,定義在Mapper文件的
下面來(lái)詳細(xì)看一下MyBatis的一二級(jí)緩存。
MyBatis一級(jí)緩存工作流程
接著看一下MyBatis一級(jí)緩存工作流程。前面說了,MyBatis的一級(jí)緩存是SqlSession級(jí)別的緩存,當(dāng)openSession()的方法運(yùn)行完畢或者主動(dòng)調(diào)用了SqlSession的close方法,SqlSession就被回收了,一級(jí)緩存與此同時(shí)也一起被回收掉了。前面的文章有說過,在MyBatis中,無(wú)論selectOne還是selectList方法,最終都被轉(zhuǎn)換為了selectList方法來(lái)執(zhí)行,那么看一下SqlSession的selectList方法的實(shí)現(xiàn):
publicList selectList(String statement, Object parameter, RowBounds rowBounds) { try { MappedStatement ms = configuration.getMappedStatement(statement); return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER); } catch (Exception e) { throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } }