jfinal的缓存处理

lewjun072 发布于 2014/06/06 16:51
阅读 2K+
收藏 5

@JFinal 你好,想跟你请教个问题:

我刚过了下jfinal官方提供的实例->jfinal_blog,想到以下几点,不知有价值没,如下:

1、

@Before(CacheInterceptor.class)
@CacheName("jfinal_cache")
public List<Blog> list() {}
这注解将就把CacheName为jfinal_cache的缓存全都清除了,要是再有个参数key,感觉就更细化了,例如:

@Before(CacheInterceptor.class)
@CacheName("jfinal_cache", "blogList")
public List<Blog> list() {}

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

2、
这个可以有吗?@CacheEvict("jfinal_cache", "blogList")放在方法上清除缓存
@CacheEvict("jfinal_cache", "blogList")
public List<Blog> list() {}
---------------------------------------------------

3、
看见已经有这样的实现,me.add(new TxByRegex(".*delete.*", false));
还可以有这样的吗?me.add(new CacheEvictByRegex(".*delete.*", false, "jfinal_cache", "blogList"));

加载中
0
糊搞

1.你直接使用@CacheName("jfinal_cache_blogList")

2.处理思路同上

3.我不说了

lewjun072
lewjun072
3ks,还可以这样啊,原来已经有。回去测试了看看效果。
0
如梦技术
如梦技术

@CacheName("jfinal_cache", "blogList")

你可能没有意识到问题,作者是根据参数去拼接key的(我没记错的话)

你这样直接写死了,一旦有参数就挂了,所有访问的数据都一样!

lewjun072
lewjun072
谢谢,还没看源码实现,只看了表面。
0
JFinal
JFinal

    感谢楼主支持哈!关于 1、2这两点,如果 cacheKey 是确定的那当然是可以的,但是有多数情况 cacheKey 是动态的,例如 list 方法可能要分页,那么 pageNumber 就要参与 cacheKey 的生成。

    关于第三点,也是可以的,只要正则能够满足清除缓存的要求就行。

    另外,有位朋友前段时间对 CacheInterceptor 进行并发测试时偶尔报异常,后来经代码审核发现 CacheInterceptor.java 第 118 行有线程安全问题,这个问题 jfinal 1.9 中会改进,有用到的童鞋,可以改下代码,使用 new XxxxRender 的方法创建具体的 render,避免线程安全问题

去开原
去开原
这块为啥有线程安全的问题,没看懂,改应该改哪里?
lewjun072
lewjun072
:) 从提问到出结果,都很有收获。
0
chrishao
chrishao
mark,学习到了不少东西
0
idreamblue
idreamblue
@JFinal 我现在用2.0,闲来没事想实现 spring那种 @Cacheable、@CacheEvict和@CachePut注解缓存,但是在实现过程我发现service拦截器里得到的类是cglib的增强类,inv.getTarget().getClass() 得到cglib$$xxx导致javaassist得不到相关方法信息。请指点一二,不胜感激。
JFinal
JFinal
回复 @idreamblue : 即便得到的是增强的class,也是可以获取到类和方法上的注解的,你试试,具体怎么解决的,能否贴出代码来分享一下,这可能是一个比较重要的需求
idreamblue
idreamblue
回复 @JFinal : 非常感谢得到回复,我想了想还是不新增包了,用2.0包自带的字节码解决了。
JFinal
JFinal
可以判断一下得到的 class,当得到的是代理类的时候,使用一下getSuperclass() 即可,具体可以看一下 jfinal 2.0 版本的 Model.java 最后一行代码,可以知道具体的做法
0
wang1957
wang1957
您好,在学习JFinal,感觉官方的JFinal手册讲的太简单了,在实际应用中会出现各种问题,比如说在登录验证的时候,我们的需求是不光验证一个表中的用户名密码,如果该表的用户名密码不同,那么就验证另外一张表的用户名密码,这样的话我怎么用Interceptor来实现对这两张表的验证,在JFinal手册中没有找见,我是初学者,不知道描述的是否清楚?
返回顶部
顶部