急于解决一个JF里的缓存问题!

情况是一个Model在登录后,放在HttpSession中了,以便有些针对此用户的操作,其中一项是删除这一对象,通过Jdon的ModelSaveAction删除正常,数据库中没了,但好象JdonFramework进行了缓存,依然显示在那儿,再次登录也还在那儿。
仔细调试,发现删除后,用Service的取得对象方法依然能取到旧对象,此时数据库中是没有了的。
看了http://www.jdon.com/jdonframework/doc/JdonFramework015.htm这篇文章中的缓存说明,再加上调试进入Jdon的源码,发现的确是AOP拦截了。问题基本确定!

于是想用最简单的办法,即在删除后,设置对象已修改,即调用Model的setModified(true),结果依旧不行。


session.delete(gp);
gp.setModified(true);

之后,想手工清除缓存,发现那篇文章中提到的都是容器外取得ModelManager的方法,我的操作是在Dao的实现里删除的,所以想在Dao实现里手工清除该对象的缓存。现在不知道怎么在容器内取得ModelManager对象啊?

其实JF手册里有说明的,容器内清除缓存,直接引用JF的一个类ModelManager就可以,可以参考jivejdon3中的com.jdon.jivejdon.service.util.ContainerUtil

奇怪的是,通过JF的ModelSaveAction删除或更新为什么不做更新对象的处理?这样使用JF的程序员很容易陷入这类问题的怪圈,就象我一开始怀疑是Hibernate缓存的问题,查了好久,最后才发现是JdonFramework中的AOP拦截机制造成的。

所以建议彭老师在更新和删除中加上对象的更新处理,不要让用户自己去清除,因为这一点是常识性的,删除和更新后用户不会希望还留着旧的对象,具体机制您可能更清楚些,比如标记对象已修改或干脆清除掉相应对象。

另外您说的JiveJdon3中的文件是:com.jdon.jivejdon.service.util.ContainerUtil 好象应该是com.jdon.jivejdon.service.imp.ContainerUtil 不过在这个Util中是构造函数直接接收到modelManager对象的,现在的问题是如何创建一个传进去呢?难道又是IOC模式?可是我还是不知道从哪儿搞一个modelManager对象来,有了这个对象,后面的事情就知道了。

>通过JF的ModelSaveAction删除或更新为什么不做更新对象的处理?
做的,可以查看ModelSaveAction的源码。

>现在的问题是如何创建一个传进去呢?难道又是IOC模式
是的,直接使用就可以,使用JF等框架,不用考虑对象的创建了,就象使用完对象不用考虑对象清除一样,这就是我在N年前说的编程划时代意义啊!

哦,原来真是IOC模式,呵呵……看来观念需要进步了,老是感觉不创建就用心里不踏实啊,哈哈……

第一个问题,您说做了处理,可是为什么我这里老是出现缓存的旧数据呢?发现这些对象都有个共同点,就是曾经用session.setAttribute("key",object)把对象设置到了HttpSession中了,不知道跟这个有没有什么关系?

>session.setAttribute("key",object)把对象设置到了HttpSession中了
是的,必须使用session.removeAttribute也来去除缓存,Session也是一种缓存。

我在原来的程序中是用了不太优雅的session.setAttribute("key",null),呵呵……

不过,即使这样在取HttpSession的值时是null,当然也就表示没有了,而重新登录后,就又变回了旧数据,因为HttpSession又从Jdon的缓存中取来了旧数据。说明Jdon的缓存没有及时更新啊?

我实际想问的问题是Jdon的缓存跟HttpSession有没有什么关系?是因为HttpSession中有残留,而影响了Jdon的缓存更新吗?

>Jdon的缓存跟HttpSession有没有什么关系
没有关系,你可以先去除你的session保存Object这一功能。JF缓存肯定在操作后会更新,可以从简单测试得知:

http://www.jdon.com/testWeb/userListAction.do?count=5

当你修改某个记录成功后,查看时是新的记录。