Engine中的全局共享对象中的数据,无法动态更新。

我项目中将一些基础数据,放到了engine的全局共享对象中,方便在模板中读取,当系统运行时修改这些数据,engine的共享对象无法进行更新操作,并给出异常key已经存在,这块怎么处理好一些?


@JFinal


public static void loadParam(){
    List<Param> list=Param.dao.find("select * from "+Param.TABLE);

    for(Param p:list){

        RenderManager.me().getEngine().addSharedObject(p.getK(),p.getVal());
        CacheKit.put(Consts.CACHE_NAMES.paramCache.name(),p.getK(),p.getVal());
    }
    StaticLog.info("系统参数加载成功");
}


评论区

lyh061619

2018-01-18 17:18

开发时确定下模板引擎启用发模式?如果没启用的话,去开启下。如:me.setDevMode(true);后再试,不懂检看下文档:http://www.jfinal.com/doc/6-2

sunyanzizi

2018-01-18 17:20

@lyh061619 谢谢你的回答。开发模式已经为true,问题是生产模式下,我也是有这样的需求,动态将系统基础数据热加载到共享对象中。

lyh061619

2018-01-18 17:34

@sunyanzizi 这个你估计得想别的办法,一定要放到引擎的共享对象中吗?能否把你的需求截图出来看看吗?

sunyanzizi

2018-01-18 17:47

@lyh061619 我看源码里,共享对象用的map,然后对key进行了校验,在key重复情况下给出异常,不清楚作者的想法。个人感觉这块是不是key存在更新值比较好。

lyh061619

2018-01-18 17:53

@sunyanzizi 这个简单啊,防止重复的共享对象key存在,这个没什么争议的了,你换别的解决方案了,如果你一定要这么用,在生产环境你就开启开发模式了,但这个有个问题,开发模式如文档说的即是加载修改立即生效,但没有缓存频繁修改引擎性能有所影响,如果这点影响可以接受你就这么干了,不然换种法子解决。

JFinal

2018-01-18 17:58

如果数据要经常变的话,不适合做成共享对象

一开始没料到你提出的这个需求,而且也会带来线程安全的问题,这个在 jfinal 3.4 中会考虑让 shared object 可以改变

目前来说,建议如下方案:
1:共享对象中放入一个 map,而你的实际要变动的数据放在这个 map 中,例如
RenderManager.me().getEngine().addSharedObject("data", new HashMap());
当然,上面的 new HashMap() 可先放入初始数据

2:在需要改变的时候,在模板中利用下面的表达式来操作:
#set(data["key值"] = object)

lyh061619

2018-01-18 18:01

@sunyanzizi 我又仔细看了下你贴出的代码,是把查询数据放到缓存中去,但没见在哪读取,也没有做缓存判断的那你这个缓存不是有点当罢设的呢,你把全部的相关代码贴出来看看嘛。

sunyanzizi

2018-01-24 11:05

@lyh061619 在页面模板里输出用了,以及一些不经常改变的,但又有可能改变的数据,例如 内容存储地址等

sunyanzizi

2018-01-24 11:07

@JFinal 明白!目前我采用了拦截器的方式从cache中读取出来然后setAttr给页面模板使用。

lyh061619

2018-01-24 14:36

@sunyanzizi 这个法子,你参考下开源Jflyfox cms,他的做法就是放到缓存中去的。源码地址:https://gitee.com/flyfox/jfinal_cms

热门反馈

扫码入社