mybatis一級快取和二級快取的優先順序

2021-09-11 21:52:22 字數 1691 閱讀 5842

大部分開發都知道mybatis存在兩種快取--一級快取和二級快取

一級快取作用於sqlsession預設是開啟的,但在spring環境需要開啟事務才能使用,開啟事務後執行到第二個dao的時候不會新建sqlsession,不開啟事務及時是同乙個方法中連續呼叫兩次同乙個dao同樣的引數都不會觸發一級快取的

二級快取作用於namespase,預設是關閉的,並且不建議開啟,集群環境會有bug的哦,單機環境使用也有很多限制的

追近心血來潮想看看mybatis這種機制是怎麼實現的,還有就是當兩種快取同時存在的時候會優先用哪個,廢話不多說上原始碼

以下**使用selectlist舉例
system.out.println(accounts);

system.out.println(accounts2);

跟蹤**到org.apache.ibatis.executor.cachingexecutor中方法
@override

throws sqlexception

return list;}}

return delegate.query(ms, parameterobject, rowbounds, resulthandler, key, boundsql);

}

很明顯剛開始就獲取了乙個cache,這個cache並不是被快取的一級快取或二級快取資訊,而是快取的實現類

開啟二級快取關閉一級快取

1.在你的dao上新增@cachenamespace標籤開啟二級快取

2.配置檔案中mybatis.configuration.cache-enabled=false關閉一級快取

通過debug發現cache中存在值了**進了if判斷中,第二次執行時會從tcm中獲取了

這裡有個很有意思的地方,兩次列印的結果物件的記憶體位址是不一樣的,是因為mybatis在二級快取的時候對結果集進行了序列化和反序列化,所以記憶體位址改變了

說完了二級快取,那一級快取在哪呢?本人能力有限,使用了很多笨辦法找了一大圈最後又回到了這個類

delegate.query(ms, parameterobject, rowbounds, resulthandler, key, boundsql)
進入這個方法

@override

errorcontext.instance().resource(ms.getresource()).activity("executing a query").object(ms.getid());

if (closed)

if (querystack == 0 && ms.isflushcacherequired())

listlist;

try else

} finally

if (querystack == 0)

// issue #601

deferredloads.clear();

if (configuration.getlocalcachescope() == localcachescope.statement)

}return list;

}

localcache應該就是這裡了,一級快取就沒什麼多說的了
一級快取和二級快取同時存在的時候優先使用二級快取

關閉二級快取 Mybatis一級快取 二級快取詳講

首先,我們先看一下這個標題 查詢快取 那就說明跟增 刪 改是沒有任何關聯的,只有在查詢時,才會遇到快取,增刪改不涉及!查詢快取目前mybatis中提供了兩個,分別是 一級快取 二級快取 所以,sqlsession的快取,是屬於一級快取 那,又有什麼用呢?比如,我們現在資料庫中有兩條資料,分別是張三跟...

mybatis查詢快取之一級快取和二級快取詳細解析

一級快取是mybatis預設就幫我們開啟的,我們不需要多做配置,但是我們得知道其中原理,否則我們也不知道怎麼使用,也不知道我們到底有沒有一級快取。上面第二部分說過一級快取的作用域是同乙個sqlsession,sqlsession的作用就是建立和資料庫的會話,我們對資料庫表的增刪改查都是通過sqlse...

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

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