大部分開發都知道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 快取重新整...