MyBatis一級快取 二級快取

2021-10-23 00:00:38 字數 3531 閱讀 3996

一級快取

在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語...