首先,我們先看一下這個(gè)標(biāo)題“查詢緩存”,那就說明跟增、刪、改是沒有任何關(guān)聯(lián)的,只有在查詢時(shí),才會(huì)遇到緩存,增刪改不涉及!
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出臺(tái)前免費(fèi)做網(wǎng)站回饋大家。查詢緩存目前Mybatis中提供了兩個(gè),分別是:一級(jí)緩存、二級(jí)緩存;
先說一下一級(jí)緩存的范圍:同一個(gè)SqlSession對(duì)象,也就說,我們是同一個(gè)SqlSession對(duì)象,又要進(jìn)行同樣的查詢操作,那么,我們就可以去緩存中獲取;
所以,SqlSession的緩存,是屬于一級(jí)緩存;
那,又有什么用呢?
比如,我們現(xiàn)在數(shù)據(jù)庫(kù)中有兩條數(shù)據(jù),分別是張三跟李四;
我現(xiàn)在呢,要根據(jù)name來查詢張三這個(gè)人,首先說明一點(diǎn),這是第一次去根據(jù)name來查詢張三,這個(gè)時(shí)候呢,我們就會(huì)去訪問數(shù)據(jù)庫(kù),去獲取name是張三的數(shù)據(jù),拿到張三后,它會(huì)把張三又放進(jìn)了Sqlssion對(duì)象中去了,Sqlssion對(duì)象存在內(nèi)存中;
也就是說,我們第一次查完后,我們會(huì)將張三這個(gè)數(shù)據(jù)從數(shù)據(jù)庫(kù)中獲取一下,獲取后放到緩存里面,此時(shí)的緩存就在內(nèi)存里面,具體的來說,它就在Sqlsession對(duì)象里面;
上述操作如下圖:
如果,再有一次或再有N次來查詢這個(gè)張三,我就不需要去訪問數(shù)據(jù)庫(kù)了,因?yàn)槲以诰彺胬锩嬉呀?jīng)有了,如果你再要拿這個(gè)張三,直接直接從緩存里面去拿;
因此呢,我們可以發(fā)現(xiàn),緩存可以減少數(shù)據(jù)庫(kù)的訪問;
我們都知道,數(shù)據(jù)庫(kù)的打開與關(guān)閉均比較費(fèi)性能,所以,我們就不需要從數(shù)據(jù)庫(kù)中拿了,直接從緩存中去獲取就完事了,意思就是可以提高性能;
只要執(zhí)行你commit(提交)這個(gè)方法,那么就會(huì)直接將SqlSession對(duì)象全部清空掉,一旦執(zhí)行commit,就會(huì)清理我們的緩存對(duì)象;
上述如下圖:
首先,這些操作,我們不需要去手動(dòng)的去編寫,我們僅需知道并了解即可,因?yàn)镸ybatis默認(rèn)了就開啟了一級(jí)緩存;
總結(jié):
如果用相同的SqlSession對(duì)象查詢相同的數(shù)據(jù),則只會(huì)在第一次查詢時(shí)發(fā)送Sql語(yǔ)句,并將這個(gè)查詢的結(jié)果放入到Sqlsession中(作為緩存存在);
后續(xù)再次查詢?cè)撏獾膶?duì)象時(shí),則直接從緩存中查詢?cè)搶?duì)象即可(即省略了數(shù)據(jù)庫(kù)的訪問)
首先,這個(gè)Mybatis自帶二級(jí)緩存;
也有三方提供的二級(jí)緩存;
Mybatis覺得緩存很重要,所以就自帶了一個(gè)緩存,但是,Mybatis必定不是搞緩存的,搞數(shù)據(jù)的,但是第三方公司給你提供了一些緩存,因?yàn)槟鉳ybatis做緩存這塊兒不是專業(yè)的;
我們可以回顧一下,一級(jí)緩存是同一個(gè)Sqlsession對(duì)象,那么二級(jí)緩存呢?
二級(jí)緩存是同一個(gè)在同一個(gè)namespace生成的mapper對(duì)象,重點(diǎn)是這個(gè)namespace;
也就是說,哪怕你生成了許多對(duì)象,只要你這個(gè)對(duì)象來自同一個(gè)namespace,它們就會(huì)共享同一個(gè)緩存;
什么是namespace,我在這里就不強(qiáng)調(diào)了,因?yàn)檫@個(gè)是mybatis入門必學(xué)的;
簡(jiǎn)單點(diǎn)來說:
只要產(chǎn)生的xxxMapper對(duì)象來自于同一個(gè)namespace,則,這個(gè)對(duì)象共享二級(jí)緩存;
二級(jí)緩存的這個(gè)共享范圍,是同一個(gè)namespace產(chǎn)生的xxxMapper對(duì)象;
開啟緩存很簡(jiǎn)單,如果你是boot項(xiàng)目的話,直接在你需要開啟的mapper.xml中加上一句話,來表示本namespace開啟了二級(jí)緩存:
;
如果是ssm框架的話,需要在conf.xml中添加一些配置:
在這里,順便提一下,mybatis的二級(jí)緩存是屬于序列化,序列化的意思就是從內(nèi)存中的數(shù)據(jù)傳到硬盤中,這個(gè)過程就是序列化;
反序列化意思就是相反而已;
也就是說,mybatis的二級(jí)緩存,實(shí)際上就是將數(shù)據(jù)放進(jìn)了硬盤文件中去了;
如果你要使用mybatis的二級(jí)緩存,那么你除了要在你需要緩存的mappe.xml中開啟以外,你還需要實(shí)現(xiàn)序列化的接口,在你需要使用二級(jí)緩存的實(shí)體類中;
去實(shí)現(xiàn)這個(gè)?Serializable(序列化)接口即可;
現(xiàn)在呢,你僅僅的將Student類給序列化了,Student有父類、級(jí)聯(lián)屬性,它們是不會(huì)跟著被序列化的,所以光這些是不夠的;
其實(shí)很簡(jiǎn)單,如果Student需要序列化,但是這個(gè)類中還有其他類的屬性,僅需將其他類也序列化即可!
比如學(xué)生類中繼承了父類,那么父類也需要實(shí)現(xiàn)Serializable這個(gè)接口進(jìn)行序列化;
該序列化也序列化了,也已經(jīng)在你需要進(jìn)行緩存的mapper.xml文件中也開啟緩存了,但是如果你使用原生的SqlsessionFacotry(SSM\SpringBoot除外因?yàn)槭羌珊玫牟恍枰獙懙讓樱┤懙臅r(shí)候會(huì)發(fā)現(xiàn),緩存并沒有起效,而是關(guān)閉Session(session.close())才生效了;
這個(gè)其實(shí)就是mybatis的一個(gè)機(jī)制,其實(shí)很好理解;
比如,我現(xiàn)在去查詢張三,獲取張三數(shù)據(jù)之后我們需要經(jīng)過序列化然后存貯到硬盤上,上面我也說過了,mybatis的二級(jí)緩存實(shí)際上就是將數(shù)據(jù)保存到硬盤上的某個(gè)文件中了,照這樣,每來一個(gè)新的對(duì)象,比如張三存進(jìn)來了,李四也需要存,王五也需要,如果是存儲(chǔ)到硬盤上,那么就會(huì)用到IO技術(shù),眾所周知,IO也是比較費(fèi)性能,所以這個(gè)機(jī)制就是當(dāng)你關(guān)閉session的時(shí)候,我們把這些張三、李四、王五這些數(shù)據(jù)一塊兒保存到硬盤上,而不是來一個(gè)保存一個(gè)這樣IO也受不了,所以就存在這樣的機(jī)制;
本文的重點(diǎn)是你有沒有收獲與成長(zhǎng),其余的都不重要,希望讀者們能謹(jǐn)記這一點(diǎn)。同時(shí)我經(jīng)過多年的收藏目前也算收集到了一套完整的學(xué)習(xí)資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展、高性能、高并發(fā)、Jvm性能調(diào)優(yōu)、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨,希望對(duì)想成為架構(gòu)師的朋友有一定的參考和幫助
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。