JFinal中使用EhCache缓存不及时更新

mekain 发布于 2012/12/14 09:30
阅读 6K+
收藏 4

@JFinal 你好,想跟你请教个问题:JFinal中使用EhCache缓存不及时更新,例如,我在blog中删除了某一条数据,数据库删除成功了,但是查询的时候,那条数据依然存在,怎么能够更新缓存!还有,刚刚说的删除某一条数据,当我加入缓存,删除数据竟然showSql不出来删除语句!

加载中
1
a
alvinte

缓存逻辑属于使用者自己处理的范畴,JFinal的缓存是数据库缓存,使用JFinal默认提供的缓存应该有个前提就是:该缓存可以不即时更新。否则就要配一套复杂的缓存逻辑,处理更新,因为同一个数据库数据可能被多个缓存数据所使用,那么当数据库更新的时候,要找出所有相关缓存再做更新。简单而折中的方式是缩短缓存时间,使数据的有效性保持在一个时间范围内。不过这样就会降低缓存命中率。总之做好权衡就行了。

建议对缓存需求比较高的话,可以直接用缓存数据为基本操作数据,用db做异步持久化。

a
alvinte
@JFinal fly2save逐渐转到新版的ufeifan去啦……首页的数据本身就是常驻内存的(⊙o⊙)…所以还没用:P
JFinal
JFinal
回复 @alvinte : JFinal 的 actoin cache 你用到 fly2save 中没?至少首页可以用一用吧 :)
a
alvinte
补充并更正一点哈:对于你的需求而言是数据库缓存,不是JFinal只实现了数据库与缓存的整合。JFinal的CacheInterceptor是针对一个Action及其所有返回数据(所有request的attribute数据)做的缓存。个人还是很欣赏这个Action缓存的设计的O(∩_∩)O~。
0
JFinal
JFinal

    JFinal 以插件形式集成的EhCache,主要是为了让开发者更方便地使用EhCache,主要是重新封装了一下 EhCache 的API,在用法上主要还是遵循EhCache 原有的使用方式,只是API更加简洁统一了。

    JFinal为了简洁与灵活性,缓存更新需要开发者自己来干预。例如对于读多写少的互联网项目来说,可能的代码形式如下:

public void blogs() {
  List<Blog> blogs = CacheKit.get("blogs", blogs);
  if (blogs == null) {
    blogs = Blog.dao.find(sql);
    CacheKit.put("blogs", blogs);
  }
  setAttr("blogs", blogs).render("blogs.html");
}
    为缓存设置一个适当的过期时间,在数据过期以后,缓存会自动更新。假如想实时更新缓存,可以在对 blog 表进行操作后马上清空一下该缓存,或者更新一下缓存也可以。


土龙
土龙
spring中有@CacheEvict注解用于清空缓存,在add,edit,delete方法上使用这个注解就可以了,不知道JFinal是否有类似实现
0
mekain
mekain

引用来自“JFinal”的答案

    JFinal 以插件形式集成的EhCache,主要是为了让开发者更方便地使用EhCache,主要是重新封装了一下 EhCache 的API,在用法上主要还是遵循EhCache 原有的使用方式,只是API更加简洁统一了。

    JFinal为了简洁与灵活性,缓存更新需要开发者自己来干预。例如对于读多写少的互联网项目来说,可能的代码形式如下:

public void blogs() {
  List<Blog> blogs = CacheKit.get("blogs", blogs);
  if (blogs == null) {
    blogs = Blog.dao.find(sql);
    CacheKit.put("blogs", blogs);
  }
  setAttr("blogs", blogs).render("blogs.html");
}
    为缓存设置一个适当的过期时间,在数据过期以后,缓存会自动更新。假如想实时更新缓存,可以在对 blog 表进行操作后马上清空一下该缓存,或者更新一下缓存也可以。


可以在对 blog 表进行操作后马上清空一下该缓存,或者更新一下缓存也可以。最后说的这个更新一下缓存,这个怎么更新!jfinal中有吗!还有就是,我上边说的,如果加入ehcache,删除数据showsql没有反应!

JFinal
JFinal
show sql 使用的是SqlReport这个类,目前只对prepareStatement这个方法进行了监控,而delete()方法用的应该是createStatement,所以没输出,这个以后考虑改进一下。更新缓存就是将缓存中不一致的数据给重替换掉,清空就是remove掉缓存中的相关数据
iSea
iSea
更新一下缓存 就是重新put新的数据进去,或者直接put null清空缓存
返回顶部
顶部