请教banq老师:关于缓存的问题

05-09-11 kyoleelqh
banq老师:

我用jdon建立一个简单的论坛,用ModelListAction的实现类,显示所有主题(包括主题名与点击次数),每次点击一个主题

该主题的点击次数就增加一,主题的SubjectService(POJOService)实现这个功能,查看数据库,可以看到次数被增加,

但是再一次用ModelListAction显示所有主题时,点击次数没有被增加,请问这是为什么,是不是缓存中的Model(主题)没有被更新

但我在更新时(次数增加),有对Model(主题)的PageIteratorSolver执行clearCache()

还有一个问题就是,在一个Action类的实现类的execute中执行WebAppUtil.getService获取POJOService,

假设有一个SubjectService,它的实现类是SubjectServicePOJOImp

第一次执行WebAppUtil.getService时会构造SubjectServicePOJOImp的实例,

但是第二次执行WebAppUtil.getService时就不会构造SubjectServicePOJOImp,为什么?

在此请banq老师指导,谢谢

         

banq
2005-09-12 11:02
多谢你能使用Jdon框架,我会一直提供强有力支持。

1.问题原因是缓存没有更新,一般Model执行clearCache()既可清除,但是如果这个Model被嵌入在其他Model里面,也就是有一个父Model,那么就要清除那个父Model了缓存了。这个次数字段应该是主题Model的一个普通字段,如同name一样。

2.因为POJOService缺省使用了对象池,所以,第一次使用会创建,第二次使用一般会使用上次创建好的对象,这如同数据库连接池一样,可提高性能。

kyoleelqh
2005-09-12 12:17
多谢banq老师指导,

如果我的更新方法不是使用POJOService的crud功能的(也就是不使用jdonframework.xml的<updateMethod name="updateSubject" />),

假如是一个update(Model m)方法,在pojoServiceImp,JdbcDAO中有它的实现,基本实现与updateSubject(EventModel em)中的代码一样,在方法最后也有调用cleanCache(),这样做有没有清除该Model的缓存,本人觉得好像没有,还有请教banq老师,如何在JdbcDAO中手工(代码实现)清除Model的缓存,

请banq老师指导,谢谢

banq
2005-09-13 10:57
哦是这样,

jdbcDao中调用cleanCache一般只能清除查询条件的缓存,不能清除单个Model缓存.

我给你做了一个工具类,用来清除特定的Model 缓存,这个类将被加入Jdon框架下一个版本。你一般是Action中,调用后台update服务之前调用本类的clearModelCache方法:

public class ModelUtil {
    private final static String module = ModelUtil.class.getName();

    private ModelManager modelManager;

    public void clearModelCache(ActionMapping actionMapping, HttpServletRequest request) throws Exception {

        if (modelManager == null) {
            ServletContext sc = request.getSession().getServletContext();
            modelManager = (ModelManager) WebAppUtil.getComponentInstance(ComponentKeys.MODEL_MANAGER, sc);
        }
        //actionMapping是struts的ActionMapping对象
        String formName = FormBeanUtil.getFormName(actionMapping);
        ModelHandler modelHandler = modelManager.borrowtHandlerObject(formName);
        try {
            ModelMapping modelMapping = modelHandler.getModelMapping();

            String keyName = modelMapping.getKeyName();
            String keyValue = request.getParameter(keyName);

            ModelKey modelKey = new ModelKey(keyValue, formName);
            modelManager.removeCache(keyValue);

        } catch (Exception ex) {
            Debug.logError(ex, module);
        } finally {
            modelManager.returnHandlerObject(modelHandler);
        }

    }

}
<p>

非常感谢,正是由于你的建议和问题促使Jdon框架不断进步。

banq
2005-09-13 11:21
注意:手工清除缓存不是必要的,因为缓存中对象是有存在周期的,这在Cache.xml中设置的,过一段时间缓存将自动清除那些超过配置时间不用的对象,这样你修改的数据将被从数据库重新加载。如果你等不及这些内在变化,可以手工处理:

猜你喜欢
3Go 1 2 3 下一页