關閉二級快取 Mybatis一級快取 二級快取詳講

2021-10-14 18:25:28 字數 2537 閱讀 6202

首先,我們先看一下這個標題「查詢快取」,那就說明跟增、刪、改是沒有任何關聯的只有在查詢時,才會遇到快取,增刪改不涉及!

查詢快取目前mybatis中提供了兩個,分別是:一級快取、二級快取;

所以,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中新增一些配置:

在這裡,順便提一下,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的二級...