MyBatis中的一級快取和二級快取介紹

2021-08-26 03:07:10 字數 2498 閱讀 8927

先說快取,合理使用快取是優化中最常見的,將從資料庫中查詢出來的資料放入快取中,下次使用時不必從資料庫查詢,而是直接從快取中讀取,避免頻繁運算元據庫,減輕資料庫的壓力,同時提高系統效能。

一級快取

一級快取是sqlsession級別的快取。在運算元據庫時需要構造sqlsession物件,在物件中有乙個資料結構用於儲存快取資料。不同的sqlsession之間的快取資料區域是互相不影響的。也就是他只能作用在同乙個sqlsession中,不同的sqlsession中的快取是互相不能讀取的。

一級快取的工作原理:

使用者發起查詢請求,查詢某條資料,sqlsession先去快取中查詢,是否有該資料,如果有,讀取;

如果沒有,從資料庫中查詢,並將查詢到的資料放入一級快取區域,供下次查詢使用。

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

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

既然有了一級快取,那麼為什麼要提供二級快取呢?

二級快取

二級快取原理:

開啟二級快取:

1,開啟總開關

在mybatis的配置檔案中加入:

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

public class user implements serializable {}
測試一下

@test

public void testcache2() throws exception

輸出結果:

debug [main] - opening jdbc connection

debug [main] - created connection 103887628.

debug [main] - setting autocommit to false on jdbc connection [com.mysql.jdbc.jdbc4connection@631330c]

debug [main] - ==> preparing: select * from user where id=?

debug [main] - ==> parameters: 1(integer)

debug [main] - <== total: 1

user [id=1, username=張三, ***=1, birthday=null, address=null]

debug [main] - resetting autocommit to true on jdbc connection [com.mysql.jdbc.jdbc4connection@631330c]

debug [main] - closing jdbc connection [com.mysql.jdbc.jdbc4connection@631330c]

debug [main] - returned connection 103887628 to pool.

user [id=1, username=張三, ***=1, birthday=null, address=null]

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

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

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

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

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

舉個簡單的例子:

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

1)對該錶的操作與查詢都在同乙個namespace下,其他的namespace如果有操作,就會發生資料的髒讀。

2)對關聯表的查詢,關聯的所有表的操作都必須在同乙個namespace。

mybatis中的一級快取和二級快取

快取的出現目的就是減少於資料庫之間頻繁的連線操作,當資料成千上萬的時候這樣的操作會極大的浪費時間,所以快取的出現解決了這個問題。mybatis中有一級快取和二級快取,一級快取就是本地的會話快取,其是自動開啟的,它存在於乙個sqlsession的執行中,即當sqlsession.close 時就結束了...

mybatis 快取(一級和二級快取)

1.快取 好處 快取的使用演示 1 sql語句或查詢條件不同 2 分屬不同sqlsession物件 3 查詢前執行clearcache 4 提交事務 2.一級快取 3.二級快取 跟 web應用中 物件作用範圍類似。cacheenabled value true flushinterval 快取重新整...

Mybatis 一級快取和二級快取

一級快取是sqlsession級別的快取 工作機制 乙個sqlsession就代表和資料庫的一次會話,在資料庫中查出的資料放在一級快取中,同乙個物件再次查詢時,會去快取中查詢,避免了再次查詢資料庫。使用 mybatis預設開啟,不需要手動設定 舉例 同乙個物件,查詢兩次,只呼叫一次sql 注 所有測...