mybatis快取機制

2022-08-24 17:27:10 字數 2251 閱讀 4782

mybatis系統中預設定義了兩級快取:一級快取和二級快取,預設情況下,mybatis只會開啟一級快取,基於sqlsession級別的。二級快取需要手動開啟和配置,他是基於namespace級別的,

為了提高可擴充套件性,mybatis提供了cache介面,可以通過實現cache介面自定義二級快取。

一、一級快取

1、一級快取(即本地快取)是基於sqlsession級別的,當session flush或close後,該session中的所有cache將被清空,本地快取不能被關閉,但可以呼叫clearcache()來清空本地快取或者改變快取的作用於,在mybatis3.1之後,可以配置本地快取的作用域--》在核心配置檔案中settings標籤中配置localcachescope(session | statement)預設為session,也就是在一次會話中,statement只用在語句執行上,同乙個sqlsession資料不會被共享

測試同乙個sqlsession兩次查詢同乙個物件只發了一條查詢sql,而且物件也相等

2、一級快取失效的四種方式

1)同乙個sqlsession條件不一樣

2)不同的sqlsession

3)同乙個sqlsession兩次查詢之間執行了增刪改操作

4)兩次查詢之間執行了clearcache() 清理了快取

二、二級快取

也稱為全域性快取,基於namespace級別的快取:乙個namespace對應乙個二級快取

工作機制:

1)、乙個會話,查詢一條資料,這個資料就會被放在當前會話的一級快取中;

2)、如果會話關閉,一級快取中的資料會被儲存到二級快取中,新的會話查詢息可

以參照二級快取中的資料;

3)、不同的namesapce查出的資料會放在自己對應的快取中(map)

查出的資料都會預設先放在一級快取中

只有會話提交或者關閉以後,一級快取中的資料才會轉移到二級緩中

二級快取的使用:

1)、開啟全域性二級快取配置:

cache的配置資訊

1、 eviction=「fifo」: 快取**策略:

• lru – 最近最少使用的:移除最長時間不被使用的物件。

• fifo – 先進先出:按物件進入快取的順序來移除它們。

• soft – 軟引用:移除基於垃圾**器狀態和軟引用規則的物件。

• weak – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的物件。

• 預設的是 lru。

2、 flushinterval: 重新整理間隔,單位毫秒

• 預設情況是不設定,也就是沒有重新整理間隔,快取僅僅呼叫語句時重新整理

3、 size: 引用數目,正整數

• 代表快取最多可以儲存多少個物件,太大容易導致記憶體溢位

4、 readonly: 唯讀, true/false

• true:唯讀快取;會給所有呼叫者返回快取物件的相同例項。 因此這些物件

不能被修改。這提供了很重要的效能優勢。

• false:讀寫快取; 會返回快取物件的拷貝(通過序列化)。這會慢一些,

但是安全,因此預設是 false。

3)、pojo需要實現序列化介面

三、快取中的配置

1、(setting)cacheenabled:true:開啟二級快取, false:關閉二級快取 一級快取仍然使用

2、每個select標籤都有乙個usecache:預設為true 使用快取, false:不使用二級快取,一級緩

存仍然使用

3、增刪改標籤都有乙個flushcache:預設為true 重新整理快取測試:《***一級二級都會都清

空***》

select標籤中的flushcache預設為false,如果設定為true每次查詢之後都會清空快取

4、sqlsession.clearcache():只是清除當前session的一級快取;

mybatis快取機制

mybatis和hibernate一樣,也提供了一二級快取。若存在一二級快取,則資料不會去資料庫互動,而是去記憶體中獲取。一級快取是sqlsession級別的快取。在運算元據庫時需要構造sqlsession物件,在物件中有乙個資料結構 一般來說是hashmap 來儲存快取資料。不同的sqlsessi...

MyBatis 快取機制

mybatis 提供了查詢快取來獲取資料,以提高查詢的效能。mybatis 的快取分為一級快取和二級快取。1 一級快取一級快取是 sqlsession 級別的快取,是基於 hashmap 的本地快取。不同的 sqlsession 之間的快取資料區域互不影響。當同乙個 sqlsession 執行兩次相...

Mybatis 快取機制

查詢快取主要是為了提高查詢訪問速度,即當使用者執行一次查詢後,會將該資料結果放到快取中,當下次再執行此查詢時就不會訪問資料庫了而是直接從快取中獲取該資料。如果在快取中找到了資料那叫做命中。同一sqlsession 多次查詢同一sql時會使用快取 test public void testlocalc...