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的特性,在类的构造方法时对调用的接口类进行依赖注入。