Mybatis系列2 一級快取和二級快取

2021-09-20 21:55:17 字數 889 閱讀 1178

一級快取缺省會啟用,存在於 sqlsession 的生命週期中,在同乙個sqlsession 中查詢時, mybatis會把執行的方法和引數通過演算法生成快取的鍵值,將鍵值和查詢結果存入乙個map物件中。如果同乙個sqlsession 中執行的方法和引數完全一致,則會返回快取中的物件。任何的 insert 、update 、 delete 操作都會清空一級快取。可以通過在select標籤上配置flushcache=「true」關閉一級快取

二級快取存在於sqlsessionfactory的生命週期中,跨sqlsession。快取是以namespace為單位的,不同namespace下的操作互不影響。setting引數 cacheenabled,這個引數是二級快取的全域性開關,如果設定為 false,即使有後面的二級快取配置,也不會生效;

開啟二級快取:

效果如下:

對映語句檔案中的所有 select 語句將會被快取。

對映語句檔案中的所有 insert,update 和 delete 語句會重新整理快取。

快取會使用 least recently used(lru,最近最少使用的)演算法來收回。

根據時間表(比如 no flush interval,沒有重新整理間隔), 快取不會以任何時間順序 來重新整理。

快取會儲存列表集合或物件(無論查詢方法返回什麼)的 512個引用。

快取會被視為是 read/write(可讀/可寫)的快取

由於二級快取是以namespace為單位,可能會出現髒讀。比如在關聯查詢時候,有乙個訂單查詢在namespacea,查詢訂單的時候會關聯查詢訂單詳細,而還有乙個查詢、修改訂單詳細在namespaceb。這時候在查詢訂單時候,訂單詳細也快取在namespacea。這時候namespaceb中修改訂單,但namespacea中的訂單詳情不會變。

mybatis一級快取

autowired private sqlsessionfactory sqlsessionfactory autowired test transactional public void test selectall.size log.info 第2次查詢 selectall2.size 同乙個s...

MyBatis 一級快取

本地快取作用域預設為該sqlsession。當session flush或 close後,該session中的所有cache將清空。同一次會話期間,只要查詢過的資料都會儲存在當前sqlsession的乙個map中 key hashcode 查詢sql的id 編寫的sql語句 引數 1.不同的sqls...

mybatis一級快取

mybatis一級快取在沒有使用事務後,本地看不到效果,查詢時還是查詢了兩次資料庫。如下圖所示 開啟事務,在同乙個方法 同乙個回話,一級快取才有效果 transactional public refund getrefundtest long brefundid 加上事務後效果如下 一級快取什麼時候...