MyBatis 二級快取 關聯重新整理實現

2021-10-05 13:12:05 字數 3974 閱讀 5781

3、關聯快取重新整理實現

查詢sql

select

u.*, o.name org_name

from

user u

left join organization o on u.org_id = o.id

where

u.id = #

userinfo queryuserinfo

(@param

("userid"

) string userid)

;

userservice

public userentity queryuser

(string userid)

呼叫查詢,得到查詢結果(多次查詢,得到快取資料),這裡 userid = 1,data為user查詢結果

}

查詢 對應 organization 資訊,結果

}

發現和user快取資料一致。

執行更新 organization 操作,將 組織1 改為 組織2,再次查詢組織資訊

}

再次查詢user資訊,發現依舊從快取中獲取

}

在 cache1 中儲存 cache2 的引用資訊cache1 執行clear時,同步操作 cache2 執行clear
開啟二級快取,本地專案使用 mybatis plus

mybatis-plus.configuration.cache-enabled=true

主要用到自定義註解cacherelations,自定義快取實現relativecache和快取上下文relativecachecontext。

@target

(elementtype.type)

@retention

(retentionpolicy.runtime)

public @inte***ce

cacherelations

; class<

?>

to()default

;}

自定義快取relativecache實現 mybatis cache 介面

public

class

relativecache

implements

cache

@override

public string getid()

@override

public

void

putobject

(object key, object value)

@override

public object getobject

(object key)

@override

public object removeobject

(object key)

@override

public

void

clear()

clearing =

true

;try

finally

}finally

}@override

public

intgetsize()

@override

public readwritelock getreadwritelock()

public

void

addrelation

(relativecache relation)

relations.

add(relation);}

void

loadrelations()

// 載入 此快取更新時 需要更新的一些快取 caches

// 將這些快取 caches 加入 至 此快取 relations 中

list

from = un_load_from_relative_caches_map.

get;

if(from != null)

cacherelations annotation = annotationutils.

findannotation

class);

if(annotation == null)

class<

?>[to

(); class<

?>

[from()

;if0)

else}}

if0)else}}

}}

快取上下文relativecachecontext

public

class

relativecachecontext

public

static

void

getcache

(class<

?> clazz)

}

@repository

@cachenamespace

(implementation = relativecache.

class

, eviction = relativecache.

class

, flushinterval =30*

60*1000

)@cacherelations

class

)public

inte***ce

extends

namespace

=>

namespace

=/>

"queryuserinfo"

resulttype

="com.mars.system.model.userinfo"

>

select u.*, o.name org_name from user u left join organization o on u.org_id = o.id

where u.id = #

select

>

>

@repository

@cachenamespace

(implementation = relativecache.

class

, eviction = relativecache.

class

, flushinterval =30*

60*1000

)public

inte***ce

extends

cachenamespace中flushinterval 在預設情況下是無效的,也就是說快取並不會定時清理。scheduledcache是對flushinterval 功能的實現,mybatis 的快取體系是用裝飾器進行功能擴充套件的,所以,如果需要定時重新整理,需要使用scheduledcache給到 relativecache新增裝飾。

至此,配置和編碼完成。

開始驗證:

查詢 userid=1的使用者資訊

}

更新組織資訊,將 組織1 改為 組織2

}

再次查詢使用者資訊

}

符合預期。

mybatis二級快取

配置檔案 不用配置也是預設開啟的 在sqlmapconfig.xml中 cacheenabled value true 如果不需要二級快取,可以在設定禁用二級快取 select 這樣每次都是從資料庫中讀取 在執行insert,update,delete後會重新整理快取 清空快取 可以設定不重新整理 ...

mybatis 二級快取

一 mybatis 二級快取 3 mybatis 預設二級快取未開啟 內建是支援二級快取的。但是由於本身是資料庫管理元件 所以快取並不好用 所以還是要用第三方的快取機制。典型的 ehcache 二 二級快取的常見演算法 lru least recently used 這種演算法是在每個物件中維護乙個...

Mybatis二級快取

原文找不到了,如果作者看到了可以留下位址,我再加上引用 sqlsession2去查詢使用者id為1的使用者資訊,去快取中找是否存在資料,如果存在直接從快取中取出資料。明白了mybatis中二級快取的原理後,接下來就是如何使用二級快取了。在使用之前,首先得開啟二級快取的開關。2.1 開啟二級快取 2....