首先,我們先看一下這個標題「查詢快取」,那就說明跟
增、刪、改是沒有任何關聯的,
只有在查詢時,才會遇到快取,增刪改不涉及!
查詢快取目前mybatis中提供了兩個,分別是:一級快取、二級快取;
先說一下一級快取的範圍:同乙個sqlsession物件,也就說,我們是同乙個sqlsession物件,又要進行同樣的查詢操作,那麼,我們就可以去快取中獲取;
所以,sqlsession的快取,是屬於一級快取;
那,又有什麼用呢?
比如,我們現在資料庫中有兩條資料,分別是張三跟李四;
我現在呢,要根據name來查詢張三這個人,首先說明一點,這是
第一次去根據name來查詢張三,這個時候呢,我們就會去訪問資料庫,去獲取name是張三的資料,拿到張三後,
它會把張三又放進了sqlssion物件中去了,sqlssion物件存在記憶體中;
也就是說,我們第一次查完後,我們會將張三這個資料從資料庫中獲取一下,獲取後放到快取裡面,此時的快取就在記憶體裡面,具體的來說,它就在sqlsession物件裡面;
上述操作如下圖:
如果,再有一次或再有n次來查詢這個張三,我就不需要去訪問資料庫了,因為我在快取裡面已經有了,如果你再要拿這個張三,直接直接從快取裡面去拿;
因此呢,我們可以發現,
快取可以減少資料庫的訪問;
我們都知道,資料庫的開啟與關閉均比較費效能,所以,我們就不需要從資料庫中拿了,直接從快取中去獲取就完事了,意思就是可以提高效能;
只要執行你commit(提交)這個方法,那麼就會直接將sqlsession物件全部清空掉,一旦執行commit,就會清理我們的快取物件;
上述如下圖:
首先,這些操作,我們不需要去手動的去編寫,我們僅需知道並了解即可,因為mybatis預設了就開啟了一級快取;
總結:
如果用相同的sqlsession物件查詢相同的資料,則只會在第一次查詢時傳送sql語句,並將這個查詢的結果放入到sqlsession中(作為快取存在);
後續再次查詢該同意的物件時,則直接從快取中查詢該物件即可(即省略了資料庫的訪問)
mybatis自帶二級快取,預設不開啟,需要手動開啟
也有三方提供的二級快取;
mybatis覺得快取很重要,所以就自帶了乙個快取,但是,mybatis必定不是搞快取的,搞資料的,但是第三方公司給你提供了一些快取,因為你mybatis做快取這塊兒不是專業的;
我們可以回顧一下,一級快取是同乙個sqlsession物件,那麼二級快取呢?
也就是說,哪怕你生成了許多物件,只要你這個物件來自同乙個namespace,它們就會共享同乙個快取;
什麼是namespace,我在這裡就不強調了,因為這個是mybatis入門必學的;
簡單點來說:
如果是ssm框架的話,需要在conf.xml中新增一些配置:
用哪個namespace,在哪個namespace中開啟二級快取,乙個cache標籤搞定!!!
在這裡,順便提一下,
mybatis的二級快取是屬於序列化,序列化的意思就是從記憶體中的資料傳到硬碟中,這個過程就是序列化;
反序列化:從硬碟到記憶體
也就是說,mybatis的二級快取,實際上就是將物件從記憶體放進了硬碟中去了;
快取的物件必須實現序列化介面:
去實現這個
serializable(序列化)介面即可;
現在呢,你僅僅的將student類給序列化了,
student有父類、級聯屬性,它們是不會跟著被序列化的,所以光這些是不夠的;
其實很簡單,如果student需要序列化,但是這個類中還有其他類的屬性,僅需將其他類也序列化即可!
比如學生類中繼承了父類,那麼父類也需要實現serializable這個介面進行序列化;
這個其實就是mybatis的乙個機制,其實很好理解;
比如,我現在去查詢張三,獲取張三資料之後我們需要經過序列化然後存貯到硬碟上,上面我也說過了,mybatis的二級快取實際上就是將資料儲存到硬碟上的某個檔案中了,照這樣,每來乙個新的物件,比如張三存進來了,李四也需要存,王五也需要,如果是儲存到硬碟上,那麼就會用到io技術,眾所周知,io也是比較費效能,所以這個機制就是當你關閉session的時候,我們把這些張
三、李四、王五這些資料一塊兒儲存到硬碟上,而不是來乙個儲存乙個這樣io也受不了,所以就存在這樣的機制;
mybatis一級快取 二級快取
一級快取基於sqlsession,是預設開啟的,在運算元據庫時需要構造sqlsession物件,在物件中有乙個hashmap用於儲存快取資料。不同的sqlsession之間快取資料區域是互相不影響的。一級快取的作用域是sqlsession範圍的,當在同乙個sqlsession中執行兩次相同的sql語...
Mybatis 一級快取 二級快取
快取分類 一級快取 事務範圍 快取只能被當前事務訪問。快取的生命週期 依賴於事務的生命週期當事務結束時,快取也就結束生命週期。在此範圍下,快取的介質是記憶體。二級快取 程序範圍 快取被程序內的所有事務共享。這些事務有 可能是併發訪問快取,因此必須對快取採取必要的事務隔離機制。快取的生命週期依賴於程序...
mybatis一級快取二級快取
前面我們說到,spring和mybatis整合時,每次查詢之後都要進行關閉sqlsession,關閉之後資料被清空。所以spring整合之後,如果沒有事務,一級快取是沒有意義的。那麼如果開啟二級快取,關閉sqlsession後,會把該sqlsession一級快取中的資料新增到namespace的二級...