mybatis 关联查询,其中一个关联表有数据更新,如何清理关联查询的缓存

联夏日 发布于 2012/11/21 11:57
阅读 4K+
收藏 1
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"/>

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

请问这个问题如何处理。

以下是问题补充:

@联夏日:我试图在ABMapper.xml 中采用cache-ref才解决这个问题,不好使。不知道是不是我配得不对。 ABMapper.xml中直接引用A以及B的命名空间, <cache-ref namespace="com.abcd.mapper.AMapper"/> <cache-ref namespace="com.abcd.mapper.BMapper"/> (2012/11/21 12:05)
加载中
0
zplswf
zplswf
http://www.iteye.com/topic/1112064 这个问题 用插件 或者 自己手动清除 目前其他的办法 好像没有  不建议关联查询呵呵
0
联夏日
联夏日

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

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

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

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


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

zplswf
zplswf
我所知道的,目前没有很好的解决方案哦!呵呵 问问其他人
0
联夏日
联夏日

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

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

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

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

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


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

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

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

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

0
联夏日
联夏日

引用来自“jackstraw”的答案

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

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

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


0
xmut
xmut
支持下,不是听说用ibatis的人很多吗?不知道他们如何解决的?
0
联夏日
联夏日

顶一下。

0
IT_小翼
IT_小翼
用Mybatis就不要用关联了。我们早都不用关联了,用了出了问题都不知道从哪里找!!
联夏日
联夏日
业务简单的话,是可以避免关联表的查询的。
0
Howard.L.Huang
Howard.L.Huang

我知道的有两种办法:

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

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

联夏日
联夏日
您上面说的“缓存策略”也同样会遇到我的这个问题。 现在使用hibernate的可能性不大,还是会选择mybatis。 即使用hubernate+ehCache我在猜想也可能会存在我刚才说的问题。
0
冶卫军
冶卫军

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

返回顶部
顶部