2014-11-06 44 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