一級快取
在baseexecutor裡面會存放乙個perpetualcache 作為一級快取,當update,commit,rollback都會呼叫clearlocalcache()方法清理一級快取。
public
abstract
class
baseexecutor
implements
executor
@suppresswarnings
("unchecked"
)@override
public
list
query
cachekey key, boundsql boundsql)
throws sqlexception
if(querystack ==
0&& ms.
isflushcacherequired()
) list
list;
tryelse
}finally
if(querystack ==0)
// issue #601
// 清空deferredloads
deferredloads.
clear()
;if(configuration.
getlocalcachescope()
== localcachescope.statement)
}return list;
}private
list
queryfromdatabase
resulthandler resulthandler, cachekey key, boundsql boundsql)
throws sqlexception
finally
// 新增到快取中
localcache.
putobject
(key, list);if
(ms.
getstatementtype()
== statementtype.callable)
return list;
}@override
public
intupdate
throws sqlexception
clearlocalcache()
;return
doupdate
(ms, parameter);}
@override
public
void
commit
(boolean required)
throws sqlexception
clearlocalcache()
;flushstatements()
;if(required)
}@override
public
void
rollback
(boolean required)
throws sqlexception
finally}}
}@override
public
void
clearlocalcache()
}}
二級快取
配置 mybatis.configuration.cache-enabled=true,只要沒有顯式地設定cacheenabled=false,都會用cachingexecutor
public
class
configuration
根據標籤的usecache屬性判斷是否使用二級快取,如果沒有傳則預設為true
public
class
xmlstatementbuilder
extends
basebuilder
public
class
xnode
else
}}
初始executor的時候設定是否使用二級快取,如果使用二級快取則是二級快取裡面存放乙個executor,在二級快取沒有資料的情況下使用存放的executor去查資料庫
public
class
defaultsqlsessionfactory
implements
sqlsessionfactory
catch
(exception e)
finally
}}
初始化cacheexecutor還是baseexecutor的實現類
public
class
configuration
else
if(executortype.reuse == executortype)
else
// 如果開啟快取(預設是開啟的),則使用快取執行器
if(cacheenabled)
// 外掛程式執行
executor =
(executor) interceptorchain.
pluginall
(executor)
;return executor;
}}
public
class
defaultsqlsession
implements
sqlsession
catch
(exception e)
finally
}}
public
class
cachingexecutor
implements
executor
@override
public
list
query
throws sqlexception
@override
public
list
query
throws sqlexception
return list;}}
// 委託給baseexecutor執行
return delegate.
query
(ms, parameterobject, rowbounds, resulthandler, key, boundsql);}
@override
public
intupdate
throws sqlexception
//刪除快取
private
void
flushcacheifrequired
}}
mybatis快取 一級快取,二級快取
什麼是快取 為什麼使用快取 適用於快取的資料 二級快取的使用步驟 在主配置檔案配置 name cacheenabled value ture 讓當前的操作支援快取 在對映檔案中 select 標籤中配置 在select標籤中 新增乙個屬性 userscache true 先建立出乙個sqlsessi...
Mybatis快取(一級快取 二級快取)
mybatis快取分為一級快取 二級快取。mybatis一級快取預設是開啟的 二級快取全域性開關預設也是開啟的,但需要配置cachenamespace才可生效!以mybatis plus為例 mybatis plus configuration log impl org.apache.ibatis....
mybatis一級快取 二級快取
一級快取基於sqlsession,是預設開啟的,在運算元據庫時需要構造sqlsession物件,在物件中有乙個hashmap用於儲存快取資料。不同的sqlsession之間快取資料區域是互相不影響的。一級快取的作用域是sqlsession範圍的,當在同乙個sqlsession中執行兩次相同的sql語...