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主要用到自定義註解cacherelations,自定義快取實現relativecache和快取上下文relativecachecontext。mybatis-plus.configuration.cache-enabled=true
@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....