web系统数据字典加载处理,冷数据处理

该博客探讨了在ERP等表格类Web系统中如何通过静态缓存提高数据读取效率,以避免频繁查询数据库。DataCache类被创建来存储静态变量,并在需要时通过Autowired的SysparamService注入接口更新数据。使用静态方法和同步锁确保线程安全,同时提供了懒加载策略。然而,这种方式可能导致数据更新延迟,影响用户实时查看修改后的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web系统加载数据字典或者类似于工程信息,项目信息这种,基本不会写的数据,在使用时虽然可以频繁读取数据库,但考虑到优化问题,还是希望通过缓存处理这种冷数据,数据库二级缓存机制会导致在写数据时,不能立即查询到已修改数据,在做类似与ERP这种表格类的web系统中时,这种方式对用户不够友好。

用类似BEAN的方式,加载一个数据缓存类型

@Component
public class DataCache {
    private static volatile String LUOSIDASTATE;
    private static volatile String LUOSIDAPATH;
    private static volatile String LOCALIP;
    private static volatile String MANCARADDRES;
    private static volatile String LOCALPORT;
    private static volatile String LIBPATH;
    public static List<LocalPersonInfo> localPersonInfos = new ArrayList<>();

    @Autowired
    public DataCache(SysparamService sysparamService) {
        DataCache.sysparamService = sysparamService;
    }

    public static String libPath(){
        if(StringUtils.isBlank(LIBPATH))
            setLibPath("D:\\hik\\");
        return LIBPATH;
    }
    public static synchronized void setLibPath(String libPath){
        LIBPATH = libPath;
    }

    private static SysparamService sysparamService;

    public static int luosidaState() {
        if (StringUtils.isBlank(LUOSIDASTATE)) {
            setluosidaState(sysparamService.getParamValueByName("luosidastate"));
        }
        try {
            return Integer.parseInt(LUOSIDASTATE);
        } catch (Exception e) {
            return -1;
        }
    }

    public static String luosidaPath() {
        if (StringUtils.isBlank(LUOSIDAPATH)) {
            setluosidaPath(sysparamService.getParamValueByName("luosidapath"));
        }
        return LUOSIDAPATH;
    }

    public static String localIP() {
        if (StringUtils.isBlank(LOCALIP))
            setLOCALIP(sysparamService.getParamValueByName("localip"));
        return LOCALIP;
    }

    public static String localPort() {
        if (StringUtils.isBlank(LOCALPORT))
            setLOCALPORT(sysparamService.getParamValueByName("localport"));
        return LOCALPORT;
    }

    public static String manCarAddress() {
        if (StringUtils.isBlank(MANCARADDRES))
            setMANCARADDRES(sysparamService.getParamValueByName("mancaraddres"));
        return MANCARADDRES;
    }

    public static List<SysParam> updateSysParamValue(List<SysParam> sysParams) {
        List<SysParam> sysParams1 = new ArrayList<>();
        for (SysParam sysParam : sysParams) {
            sysParams1.add(new SysParam(sysParam.getName(), sysparamService.setParamValueByName(sysParam.getName(), sysParam.getValue())));
            switch (sysParam.getName()) {
                case "luosidastate":
                    setluosidaState(sysParam.getValue());
                    break;
                case "luosidapath":
                    setluosidaPath(sysParam.getValue());
                    break;
                case "localip":
                    setLOCALIP(sysParam.getValue());
                    break;
                case "localport":
                    setLOCALPORT(sysParam.getValue());
                    break;
                case "mancaraddres":
                    setMANCARADDRES(sysParam.getValue());
                    break;
                default:
                    break;
            }
        }
        return sysParams1;
    }

    private static synchronized void setluosidaState(String luosidastate) {
        LUOSIDASTATE = luosidastate;
    }

    private static synchronized void setluosidaPath(String luosidapath) {
        LUOSIDAPATH = luosidapath;
    }

    private static synchronized void setLOCALIP(String localip) {
        LOCALIP = localip;
    }

    private static synchronized void setLOCALPORT(String localport) {
        LOCALPORT = localport;
    }

    private static synchronized void setMANCARADDRES(String mancaraddres) {
        MANCARADDRES = mancaraddres;
    }

新建DataCache类提供静态读写方法,防止线程冲突,需要分别加上读写锁,然后在项目启动过后利用ApplicationRuner类可以立刻加载数据,也可以在使用时调用读方法读数据,类似于懒加载的方式。

需要注意的是由于是静态方法调用,所以在使用autowrid注解时,需要利用spring的特性,在类的构造方法时对调用的接口类进行依赖注入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值