基础资料数据存在缓存,缓存管理清除后正常
1、基础资料以视图作为数据源,视图数据发生改变时,基础资料存在缓存
问题现象
排查步骤
可通过勾选“禁用缓存”属性解决。
2、通过SQL更新基础资料数据,结果系统内对应基础资料未同步更新
问题现象
二开插件通过SQL脚本修改基础资料数据,但是前台对应基础资料未同步更新。
排查步骤
二开插件修改数据同时,也需要通过代码清除对应基础资料缓存,具体可参考:
https://vip.kingdee.com/article/185759531572440832?productLineId=1&isKnowledge=2
3、二开插件代码清除基础资料数据缓存,但是不生效
问题现象
调用CacheUtil.ClearCache(ctx.GetAreaCacheKey(), tableName)方法清除缓存不成功。
排查步骤
CacheUtil.ClearCache() 方法第一个参数是【区AreaCacheKey】隔离标识,常见的传参有 ctx.GetAreaCacheKey() 跟 ctx.GetDBCacheKey() 两个。
反编译看的话,ctx.GetAreaCacheKey() 代表的是:DBId + IsMultiOrg + UserLocale.LCID(账套ID+是否多组织+登录语言ID),而ctx.GetDBCacheKey() 代表的则是:DBId + IsMultiOrg(账套ID+是否多组织)。对比两者的差异,区别在于是否区分多语言,ctx.GetDBCacheKey()没有多语言隔离。
早期版本,标准产品数据缓存的Area区,用的是 ctx.GetAreaCacheKey() 作为隔离标识,直到22年9月份版本开始不区分多语言,原因是数据缓存默认加载全部语言数据,不存在语言的区别,出于性能优化考虑,数据缓存改用 ctx.GetDBCacheKey() 作为Area区。
即22年9月之前的版本可以用 CacheUtil.ClearCache(ctx.GetAreaCacheKey(), tableName) 方法清除缓存,22年9月及之后的版本需改用 CacheUtil.ClearCache(ctx.GetDBCacheKey(), tableName) 方法清除数据缓存。