溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mybatis一級緩存、二級緩存詳講

發(fā)布時間:2020-06-27 13:32:50 來源:網絡 閱讀:590 作者:Java_老男孩 欄目:編程語言

查詢緩存

首先,我們先看一下這個標題“查詢緩存”,那就說明跟增、刪、改是沒有任何關聯(lián)的,只有在查詢時,才會遇到緩存,增刪改不涉及!

查詢緩存目前Mybatis中提供了兩個,分別是:一級緩存、二級緩存;

一級緩存

先說一下一級緩存的范圍:同一個SqlSession對象,也就說,我們是同一個SqlSession對象,又要進行同樣的查詢操作,那么,我們就可以去緩存中獲??;

所以,SqlSession的緩存,是屬于一級緩存;

那,又有什么用呢?

比如,我們現(xiàn)在數(shù)據(jù)庫中有兩條數(shù)據(jù),分別是張三跟李四;

我現(xiàn)在呢,要根據(jù)name來查詢張三這個人,首先說明一點,這是第一次去根據(jù)name來查詢張三,這個時候呢,我們就會去訪問數(shù)據(jù)庫,去獲取name是張三的數(shù)據(jù),拿到張三后,它會把張三又放進了Sqlssion對象中去了,Sqlssion對象存在內存中;

也就是說,我們第一次查完后,我們會將張三這個數(shù)據(jù)從數(shù)據(jù)庫中獲取一下,獲取后放到緩存里面,此時的緩存就在內存里面,具體的來說,它就在Sqlsession對象里面;

上述操作如下圖:

Mybatis一級緩存、二級緩存詳講

如果,再有一次或再有N次來查詢這個張三,我就不需要去訪問數(shù)據(jù)庫了,因為我在緩存里面已經有了,如果你再要拿這個張三,直接直接從緩存里面去拿;

因此呢,我們可以發(fā)現(xiàn),緩存可以減少數(shù)據(jù)庫的訪問;

Mybatis一級緩存、二級緩存詳講

我們都知道,數(shù)據(jù)庫的打開與關閉均比較費性能,所以,我們就不需要從數(shù)據(jù)庫中拿了,直接從緩存中去獲取就完事了,意思就是可以提高性能;

SqlSession對象清空機制

只要執(zhí)行你commit(提交)這個方法,那么就會直接將SqlSession對象全部清空掉,一旦執(zhí)行commit,就會清理我們的緩存對象;

上述如下圖:

Mybatis一級緩存、二級緩存詳講

首先,這些操作,我們不需要去手動的去編寫,我們僅需知道并了解即可,因為Mybatis默認了就開啟了一級緩存;

總結:

如果用相同的SqlSession對象查詢相同的數(shù)據(jù),則只會在第一次查詢時發(fā)送Sql語句,并將這個查詢的結果放入到Sqlsession中(作為緩存存在);

后續(xù)再次查詢該同意的對象時,則直接從緩存中查詢該對象即可(即省略了數(shù)據(jù)庫的訪問)

二級緩存

首先,這個Mybatis自帶二級緩存;

也有三方提供的二級緩存;

Mybatis覺得緩存很重要,所以就自帶了一個緩存,但是,Mybatis必定不是搞緩存的,搞數(shù)據(jù)的,但是第三方公司給你提供了一些緩存,因為你mybatis做緩存這塊兒不是專業(yè)的;

我們可以回顧一下,一級緩存是同一個Sqlsession對象,那么二級緩存呢?

二級緩存是同一個在同一個namespace生成的mapper對象,重點是這個namespace;

也就是說,哪怕你生成了許多對象,只要你這個對象來自同一個namespace,它們就會共享同一個緩存;

什么是namespace,我在這里就不強調了,因為這個是mybatis入門必學的;

簡單點來說:

只要產生的xxxMapper對象來自于同一個namespace,則,這個對象共享二級緩存;

二級緩存的這個共享范圍,是同一個namespace產生的xxxMapper對象;

開啟緩存很簡單,如果你是boot項目的話,直接在你需要開啟的mapper.xml中加上一句話,來表示本namespace開啟了二級緩存:

<cache/>;

如果是ssm框架的話,需要在conf.xml中添加一些配置:

Mybatis一級緩存、二級緩存詳講

在這里,順便提一下,mybatis的二級緩存是屬于序列化,序列化的意思就是從內存中的數(shù)據(jù)傳到硬盤中,這個過程就是序列化;

反序列化意思就是相反而已;

也就是說,mybatis的二級緩存,實際上就是將數(shù)據(jù)放進了硬盤文件中去了;

實現(xiàn)序列化接口

如果你要使用mybatis的二級緩存,那么你除了要在你需要緩存的mappe.xml中開啟以外,你還需要實現(xiàn)序列化的接口,在你需要使用二級緩存的實體類中;

Mybatis一級緩存、二級緩存詳講

去實現(xiàn)這個?Serializable(序列化)接口即可;

?現(xiàn)在呢,你僅僅的將Student類給序列化了,Student有父類、級聯(lián)屬性,它們是不會跟著被序列化的,所以光這些是不夠的;

其實很簡單,如果Student需要序列化,但是這個類中還有其他類的屬性,僅需將其他類也序列化即可!

比如學生類中繼承了父類,那么父類也需要實現(xiàn)Serializable這個接口進行序列化;

緩存時機

該序列化也序列化了,也已經在你需要進行緩存的mapper.xml文件中也開啟緩存了,但是如果你使用原生的SqlsessionFacotry(SSM\SpringBoot除外因為是集成好的不需要寫底層)去寫的時候會發(fā)現(xiàn),緩存并沒有起效,而是關閉Session(session.close())才生效了;

這個其實就是mybatis的一個機制,其實很好理解;

比如,我現(xiàn)在去查詢張三,獲取張三數(shù)據(jù)之后我們需要經過序列化然后存貯到硬盤上,上面我也說過了,mybatis的二級緩存實際上就是將數(shù)據(jù)保存到硬盤上的某個文件中了,照這樣,每來一個新的對象,比如張三存進來了,李四也需要存,王五也需要,如果是存儲到硬盤上,那么就會用到IO技術,眾所周知,IO也是比較費性能,所以這個機制就是當你關閉session的時候,我們把這些張三、李四、王五這些數(shù)據(jù)一塊兒保存到硬盤上,而不是來一個保存一個這樣IO也受不了,所以就存在這樣的機制;


本文的重點是你有沒有收獲與成長,其余的都不重要,希望讀者們能謹記這一點。同時我經過多年的收藏目前也算收集到了一套完整的學習資料,包括但不限于:分布式架構、高可擴展、高性能、高并發(fā)、Jvm性能調優(yōu)、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階干貨,希望對想成為架構師的朋友有一定的參考和幫助

需要更詳細架構師技能思維導圖和以下資料的可以加一下技術交流分享群:“708 701 457”免費獲取

Mybatis一級緩存、二級緩存詳講
Mybatis一級緩存、二級緩存詳講

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI