论坛首页 Java版 Spring

设计AOP缓存时遇到的一个问题

浏览 624 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
时间:2008-03-16
为了缓存查询结果,使用Spring AOP(cglib)在业务层放置缓存拦截器,这样遇到的一个问题就是:如果一个业务方法同时包含读和写的操作(例如显示帖子列表的业务方法,既要查询又要递增阅读数),如果该方法被缓存,那么当缓存命中时,写操作也会被略过,这是不符合业务逻辑的。后来想到把这个业务方法的读和写分成两个内部方法,仅对实现读操作的那个内部方法启用缓存,但是又遇到问题了,实现读操作的内部方法根本没有被拦截,经过测试发现,业务类里的this仍然指向业务类自身,而不是cglib处理过后的业务类的子类,所以在业务方法里调用此业务类的其它方法时,那些其它方法是不会被拦截到的。不知道各位有什么好办法解决这个问题?
   
时间:2008-04-03
Taishen 写道
如果一个业务方法同时包含读和写的操作(例如显示帖子列表的业务方法,既要查询又要递增阅读数),

应该在dao层做AOP cache,对每个CRUD操作做相应的cache CRUD操作
   
0 请登录后投票
时间:2008-04-04
Spring AOP实现机制导致的
   
0 请登录后投票
时间:2008-04-04
使用AspectJ
   
0 请登录后投票
时间:2008-05-04
谢谢,已经用AspectJ解决掉了。
不过我觉得缓存放在dao层不太合适,要缓存的通常都是业务层的查询,而很多情况下,对于dao层应该失效的缓存,对业务层其实是可以继续使用的,所以为了减少缓存的flush,提高缓存命中率,我把缓存放在了业务层。
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛:
JavaEye推荐
    快速回复 引用上一条消息 (Alt+S)