我有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,效率不高。
你得到这方面的任何解决方案? – Sagar 2016-10-24 09:00:18
@Sagar我还没有想出任何'神奇'的解决方案。但我学到的一个教训是,有时不使用关联并仅存储引用对象的id更容易。然后你可以从缓存的DAO中查找这些对象。 – 2016-10-25 10:00:45