2014-11-06 72 views
4

我有2個映射器mapperA和mapperB。MyBatis - 緩存刷新後嵌套結果不會更新

mapperA有結果圖A,其中只包含結果元素(簡單屬性)並緩存在自己的名稱空間中。

mapperB具有結果映射B,它包含與A(select語句findById)的關聯,並且也緩存在自己的命名空間中。

問題是:

  • mapperB.findById(負載B和相關的 - 無論它緩存)
  • mapperA.findById(沒有選擇執行的是緩存)
  • mapperA.update(更新一些A - 高速緩存A變刷新)
  • mapperA.findById(選擇執行 - 加載A更新)
  • mapperB.findById - 這裏是問題 - 沒有執行選擇,b因爲B被緩存了。但它被A實例緩存。此實例不反映更新。應該執行select/cache lookup來加載當前的A實例。

我的問題是:

如何使當兩個結果被緩存協會才能正常工作。

注:

我知道我可以強制A和B映射器使用單一命名空間的緩存,所以當一個更新,將刷新所有緩存A和B的查詢。但考慮到我有10個實例 - 這些實例每隔幾分鐘就會更新一次。還有1千萬個B實例 - 這些實例每天都會更新一次。每次更新A都會沖洗所有B,效率不高。

+0

你得到這方面的任何解決方案? – Sagar 2016-10-24 09:00:18

+1

@Sagar我還沒有想出任何'神奇'的解決方案。但我學到的一個教訓是,有時不使用關聯並僅存儲引用對象的id更容易。然後你可以從緩存的DAO中查找這些對象。 – 2016-10-25 10:00:45

回答

0

您應該使用同名空間緩存。

在mapperA:

< mapper namespace="mapperA"> 

< cache/> 

...

在mapperB:

< mapper namespace="mapperB"> 

< cache-ref namespace="mapperA"/> 

... 
+1

謝謝。我知道這個解決方案 - 請參閱我的問題的註釋部分。 – 2015-04-02 06:50:19