mybatis查詢快取之一級快取和二級快取詳細解析

2021-10-07 04:21:23 字數 1838 閱讀 7199

一級快取是mybatis預設就幫我們開啟的,我們不需要多做配置,但是我們得知道其中原理,否則我們也不知道怎麼使用,也不知道我們到底有沒有一級快取。

上面第二部分說過一級快取的作用域是同乙個sqlsession,sqlsession的作用就是建立和資料庫的會話,我們對資料庫表的增刪改查都是通過sqlsession去執行指定的sql完成的,而sqlsession和資料庫的連線並不是永久連線的,也一定要杜絕這種永久連線;所以就有了sqlsession的建立和關閉,sqlsession預設執行完一段的sql片段後就會close掉sqlsession,即銷毀sqlsession;而下一次對資料庫的操作的又會重新建立會話關係,即建立新的sqlsession,所以這就和前一次的執行sql的sqlsession屬於不同的sql session了,也就這兩個sqlsession就不存在一級快取關係了;**分析如下:

圖1-1:未正確使用一級快取

圖1-2:未正確使用一級快取

由兩張圖可以看出上面的**執行了兩次與資料庫的會話,因為每次都新建了sqlsession,不在一級快取的作用域內,而且每次執行的sql也都幫我們列印出來了,所以說程式並沒有用到我們的一級快取;那麼如何將一級快取利用起來呢?這就需要用到我們的spring事務管理;現在的**如下:

圖2:正確使用一級快取結果

可以看到開啟spring事務之後,同樣的業務**,在這裡sql片段只列印一遍,而且在執行第二次查詢的時候沒有在重新建立sqlsession,所以是同乙個sqlsession,說明第二次查詢的資料是從快取中獲取的,所以證明這裡是一級快取起了作用;關於spring事務不知如何使用的,可以參看我的另一篇文章(而關於spring事務管理的service只會乙個建立sqlsession,這是因為事務管理下的sql執行方式是batch,只會與資料庫互動一次,一次執行完所有的sql,所以只會建立乙個sqlsession;

2:二級快取

在mybatis-config.xml檔案中的標籤配置開啟快取,**如下:

然後可以開始試著執行我們的**如下:   

圖三:序列化異常

執行結果報序列化異常,那是因為我們對映的pojo物件未實現序列化介面,說明我們從快取資料中讀取資料需要進行反序列化,這是因 為mybatis的二級快取的快取介質有多種多樣,而並不一定是在記憶體中,所以需要我們對pojo物件進行序列化,只要實現序列化介面即可,而對於序列化和反序列化不清楚的讀者可以參看我的另外一篇文章(序列化的就不截圖了,直接看我們的正確執行結果,如下圖:

可以看到,第一次查詢有列印sql,而第二次查詢沒有列印sql,而且還有正確的返回資料,而上面的**也沒有開啟spring事務

,說明不存在mybatis的一級快取,唯一能起作用的就是二級快取了;

3:拓展延申

對於同乙個service被同乙個請求分多次呼叫,則所有的這些呼叫之間的一級快取和二級快取個事什麼情況呢?

一級快取是基於sqlsession的,當一次請求結束之後,意味著session執行結束,所以sqlsession也就關閉了,所以快取也就清空了,因此,對於多次的請求,肯定不存在一級快取;

Mybatis學習(13)查詢快取之一級快取

設定快取的目的就是為了提高查詢訪問速度。mybatis根據緩衝區的作用域劃分為兩種 一級查詢快取和二級查詢快取 基於perpetualcache 的 hashmap本地快取,其儲存作用域為session,當session flush或close之後,該session中的所有 cache 就將清空。也...

MyBatis入門之一級快取

mybatis的一級快取作用域是sqlsession的,所以,對於同乙個sqlsession,相同的查詢,只有在第一次查詢的時候才會到資料庫查詢,其餘都是從快取中拿。但是,如果兩次查詢之間,發生了資料更新 包括增 刪 改 操作,則會清除快取。mybatis預設是開啟一級快取的。此外,如果 1 關閉s...

MyBatis之一級快取及其一級快取失效

定義 一級快取 本地快取 與資料庫同一次會話 sqlsession 期間查詢到的資料會放在本地快取中,如果以後要獲取相同的資料直接從快取中獲取,不會再次向資料庫查詢資料 乙個sqlsession擁有乙個一級快取 mybatis一直開啟一級快取,不同的sqlsession級別的快取,資料不可以共用 一...