MyBatis快取技術的認識(通俗易懂)

2022-01-10 09:23:39 字數 2217 閱讀 1665

在乙個web專案中,查詢資料庫中的操作算是乙個非常常用的操作,但是有些資料會被經常性的查詢,而每一次都去資料庫中查詢這些重複的資料,會很消耗資料庫的資源,同時使得查詢效率也很低,而 mybatis 中就通過快取技術來解決這樣的問題,也就是說:將一些經常查詢,並且不經常改變的,以及資料的正確對最後的結果影響不大的資料,放置在乙個快取容器中,當使用者再次查詢這些資料的時候,就不必再去資料庫中查詢,直接在快取中提取就可以了

注:快取可以簡單理解為存在於記憶體中的臨時資料

mybatis 提供了 一級快取和二級快取兩種形式

上面我們總的講了一級快取的原理,現在梳理一下它細節

以乙個通過 id 查詢使用者的例子來說

演示前,我把需要準備的一些類或者表現貼出來

user表

create table user (

`id` int(11)not null auto_increment,

`username` varchar(32) not null comment '使用者名稱',

`telephone` varchar(11) not null comment '手機',

`birthday` datetime default null comment '生日',

`gender` char(1) default null comment '性別',

`address` varchar(256) default null comment '位址',

primary key (`id`)

) engine=innodb default charset=utf8;

user實體類
public class user implements serializable
/**

* 根據id查詢使用者資訊

* @param userid

* @return

*/user findbyid(integer userid);

}

<?xml version="1.0" encoding="utf-8"?>

select * from user where id = #

測試方法

/**

* 測試查詢所有

*/@test

public void testfirstlevelcache()

執行效果

可以很明顯的看到,當我們在同乙個 sqlsession的情況下,當我們第一次查詢 id 值為 16 的使用者時,從資料庫中確實查詢到了資料,而第二次查詢的時候,卻沒有任何日誌的資料,而同時我們可以看到,通過輸出語句,看到兩個物件是完全相同的,這也就意味著,第二次查詢不是從資料庫查詢出來的,而是從快取中

通過上面的簡單認識,我們認識到一級快取是基於同乙個 sqlsession的,但是有時候由於方法封裝的原因,或者在查詢完,sqlsession 物件會關閉,一級快取就清空了,會導致無法從中獲取內容

當某個 sqlsession 類的例項物件執行了增刪改操作時,二級快取會被清空

測試**

@test

public void testsecondlevelcache()

第一次執行效果

看完測試**,我們發現,sql執行了兩次,很顯然,沒有達到了我們的期望,那麼是**不對呢?

答案是,在mybatis中一級快取是預設開啟的,而二級快取則需要進行配置開啟

要開啟二級快取,需要進行兩個操作步驟

通過官網的文件,可以看到,預設值就是true,所以,不配置也是可以的,不過我們還是先給出來

修改 sqlmapconfig.xml

只需要在檔案中新增乙個 cache標籤就可以了,非常簡單

執行效果

還有乙個需要注意的地方,那就是我們最後做的判斷system.out.println(user1 == user2);為什麼的到的結果卻是 false呢?

這是因為,在二級快取中,存入的是值,而不是物件,當需要使用的時候,會建立出新的使用者,然後將值傳入,所以這裡是不等的

在這裡的我們素不相識,卻都在為了自己的夢而努力 ❤

MyBatis快取技術

禁用二級快取 重新整理快取 org.mybatis.cachesgroupid mybatis ehcacheartifactid 1.0.2version dependency 第二步 引入快取配置檔案 classpath下 src下 新增 ehcache.xml xsi nonamespaces...

MyBatis快取技術

為了提公升查詢效率,提高使用者體驗,mybatis提供了資料快取支援,依據資料快取的有效範圍預設定義了一級快取和二級快取 1 該級快取預設開啟,不能關閉 2 該級快取為sqlsession級別的快取,也稱為本地快取 效果如下 public static void main string args c...

mybatis 一 快取技術

mybatis 預設開啟一級快取,sqlsession 級別的,它會出現髒讀的情況,比如說你在乙個service 方法中執行了三個sql語句,第乙個查詢sql語句,第二個更新sql語句,第三個查詢sql語句,第一次執行查詢sql語句的時候會將sql和對應的結果集儲存在乙個hashmap中,但是更新s...