12
回答
mybatis 关联查询,其中一个关联表有数据更新,如何清理关联查询的缓存
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
1、select * from A ,对应AMapper.xml 这个数据被缓存了,若A表有更新,它的缓存也会被清掉,这是正常的。

2、select * from A inner join B  A.b_id=B.id   ,对应ABMapper.xml    若使用select语句,则相关数据也会被缓存。

问题来了,当A或B有更新的时候,只刷新了A或B表的缓存。此时并没有刷新ABMapper.xml中的关联查询的缓存。


所涉及的关键jar如下:

spymemcached-2.8.1.jar

mybatis-memcached-1.0.0-beta1-1210.jar

mybatis-3.1.1.jar

PS:

2个sql分别在不同的mapper.xml文件中。

每个mapper.xml都配置了

<cache eviction="LRU" type="org.mybatis.caches.memcached.MemcachedCache"/>

--------------------------------------------------------------------------------------------------------------

请问这个问题如何处理。

举报
联夏日
发帖于5年前 12回/4K+阅

以下是问题补充:

  • @联夏日 :我试图在ABMapper.xml 中采用cache-ref才解决这个问题,不好使。不知道是不是我配得不对。 ABMapper.xml中直接引用A以及B的命名空间, <cache-ref namespace="com.abcd.mapper.AMapper"/> <cache-ref namespace="com.abcd.mapper.BMapper"/> (5年前)
共有12个答案 最后回答: 2年前

引用来自“张培立”的答案

http://www.iteye.com/topic/1112064 这个问题 用插件 或者 自己手动清除 目前其他的办法 好像没有  不建议关联查询呵呵

在实际的业务操作中,关联表是经常的。

希望能找到一个关联表查询处理缓存较好的解决方案。


手动清除不是不可以,只是比较费劲,很多地方都要处理,会使系统变得臃肿。比如我关联了3个表,那么可以在这3个表单独更新的地方调用一下关联表相关清缓存的方法,比如都调用一下update。

--- 共有 1 条评论 ---
zplswf我所知道的,目前没有很好的解决方案哦!呵呵 问问其他人 5年前 回复

引用来自“联夏日”的答案

引用来自“张培立”的答案

http://www.iteye.com/topic/1112064 这个问题 用插件 或者 自己手动清除 目前其他的办法 好像没有  不建议关联查询呵呵

在实际的业务操作中,关联表是经常的。

希望能找到一个关联表查询处理缓存较好的解决方案。


手动清除不是不可以,只是比较费劲,很多地方都要处理,会使系统变得臃肿。比如我关联了3个表,那么可以在这3个表单独更新的地方调用一下关联表相关清缓存的方法,比如都调用一下update。

再往后代码会变得越来越难维护。

引用来自“jackstraw”的答案

1:更新删除操作的地方如需select,sqlSession.clearCache()下

2:尽量把他们放到一个mapper下

关联查询地方很多,放到一个mapper下不太现实,而且也不利于维护。


用Mybatis就不要用关联了。我们早都不用关联了,用了出了问题都不知道从哪里找!!
--- 共有 1 条评论 ---
联夏日业务简单的话,是可以避免关联表的查询的。 5年前 回复

我知道的有两种办法:

1.如果ORM是xBatis或者jdbc,可以构建一个cache层,选择自己的缓存策略(本地缓存?分布式缓存?),尽在你的控制,只要缓存的粒度足够小,基本不会遇到你说的问题;

2.可以用Hibernate+ehCache,用的好性能据说也不错。

--- 共有 1 条评论 ---
联夏日您上面说的“缓存策略”也同样会遇到我的这个问题。 现在使用hibernate的可能性不大,还是会选择mybatis。 即使用hubernate+ehCache我在猜想也可能会存在我刚才说的问题。 5年前 回复

我目前也在解决这个问题,思路:通过配置+mybatis plugin机制来解决,mybatis的更新时缓存粒度比较粗,想更细的话可以自已实现。

顶部