雜談 Mybatis一二級快取簡單詳解

2021-09-05 08:50:14 字數 2091 閱讀 2359

先說快取,合理使用快取是優化中最常見。將從資料庫中查詢出來的資料放入快取(記憶體)中,每次查詢資料時,先判斷快取區中是否存在資料,如果存在,就從快取區中獲取資料,如果不存在,就從資料庫中獲取資料,將資料存放到快取區中。這樣的話,下次訪問該資料的時候使就不必從資料庫查詢,而是直接從快取中讀取,避免頻繁運算元據庫,提高資料訪問效率,減輕資料庫的壓力,同時提高系統效能。

咱們今天就來認識一下mybatis的一二級快取。

1.一級快取

一級快取是sqlsession級別的快取,mybatis預設開啟一級快取。在運算元據庫時需要構造sqlsession物件,在該物件中有乙個資料結構用於儲存快取資料。不同的sqlsession之間的快取資料區域(hashmap)是互相不影響的。換句話說,不同的sqlsession中的快取是互相不能讀取的,即不共享。

一級快取的工作原理如下圖:

流程描述如下: 

需要注意,sqlsession執行commit,即增刪改操作時會清空快取。這麼做的目的是避免髒讀。

為什麼說清空快取就可以避免髒讀呢?

如果commit不清空快取,會有以下場景:

a查詢了某商品庫存為10件,並將10件庫存的資料存入快取中,之後被客戶買走了10件,資料被delete了,但是下次查詢這件商品時,並不從資料庫中查詢,而是從快取中查詢,就會出現錯誤。

那二級快取就更加好了嗎?下面來看看。

2.二級快取

mybatis的二級快取是預設關閉的,那麼如何開啟二級快取呢?且看如下步驟:

開啟二級快取:

1,開啟總開關,在mybatis的配置檔案中加入:

3,讓使用二級快取的pojo類實現serializable介面

public class user implements serializable {}
測試一下

@test

public void testcache2() throws exception

輸出結果:

我們可以從列印的資訊看出,兩個sqlsession,去查詢同一條資料,只會發起一次select查詢語句,第二次直接從cache中讀取。

前面我們說到,spring和mybatis整合時, 每次查詢之後都要進行關閉sqlsession,關閉之後資料被清空。所以spring整合之後,如果沒有事務,一級快取是沒有意義的。而如果開啟二級快取的話,關閉sqlsession後,會把該sqlsession一級快取中的資料新增到namespace的二級快取中。這樣,快取在sqlsession關閉之後依然存在。

總結:對於查詢多commit少且使用者對查詢結果實時性要求不高,此時採用mybatis二級快取技術可以降低資料庫訪問量,提高訪問速度。

但不能濫用二級快取,二級快取也有很多弊端,從mybatis預設二級快取是關閉的就可以看出來。為什麼說它有弊端呢?

二級快取是建立在同乙個namespace下的,如果對錶的操作查詢可能有多個namespace,那麼得到的資料就是錯誤的。

舉個簡單的例子:

根據以上,想要使用二級快取時需要想好兩個問題:

參考文章:

推薦文章:較為深入)

較為全面)

mybatis二級快取

配置檔案 不用配置也是預設開啟的 在sqlmapconfig.xml中 cacheenabled value true 如果不需要二級快取,可以在設定禁用二級快取 select 這樣每次都是從資料庫中讀取 在執行insert,update,delete後會重新整理快取 清空快取 可以設定不重新整理 ...

mybatis 二級快取

一 mybatis 二級快取 3 mybatis 預設二級快取未開啟 內建是支援二級快取的。但是由於本身是資料庫管理元件 所以快取並不好用 所以還是要用第三方的快取機制。典型的 ehcache 二 二級快取的常見演算法 lru least recently used 這種演算法是在每個物件中維護乙個...

Mybatis二級快取

原文找不到了,如果作者看到了可以留下位址,我再加上引用 sqlsession2去查詢使用者id為1的使用者資訊,去快取中找是否存在資料,如果存在直接從快取中取出資料。明白了mybatis中二級快取的原理後,接下來就是如何使用二級快取了。在使用之前,首先得開啟二級快取的開關。2.1 開啟二級快取 2....