持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
为什么要缓存系统常量数据
有些常量数据是我们在系统初始化的时候就需要去加载完成的,并经常需要去使用这些数据。我们不可能没事需要使用的时候再去数据库中读取这些数据,这样不仅代码冗余,而且也会影响系统的运行速度,并增加数据库的压力。这时候我们就需要将这些数据进行缓存,方便后续程序中的使用,而不是经常性的为一些常量而去重复的读取数据库。
怎么实现
设计SQL语句,用于保存常量
可以在这个基础上进行扩展。
CREATE TABLE `sys_config` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`param_key` varchar(200) NOT NULL COMMENT '参数名',
`param_value` varchar(200) DEFAULT NULL COMMENT '参数值',
`status` tinyint(1) unsigned NOT NULL COMMENT '状态',
`remark` varchar(200) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `unq_param_key` (`param_key`) USING BTREE,
KEY `idx_status` (`status`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
在xml文件中编写查询语句
<select id="selectAllParam" resultType="com.example.emos.wx.db.pojo.SysConfig">
SELECT param_key, param_value FROM sys_config WHERE status = 1;
</select>
在DAO层申明抽象方法
public List<SysConfig> selectAllParam();
创建一个封装类,用于保存需要缓存的常量
@Data
@Component
public class SystemConstants {
public String suibian1;
public String suibian2;
public String suibian3;
public String suibian4;
public String suibian5;
public String suibian6;
}
在启动项中添加init()方法
最后我们需要将方法在系统启动的时候进行缓存,就必须在启动项中添加init()方法,并实现读取常量数据并缓存的操作。
需要为方法添加上@PostConstruct注解,方法才能在系统初始化的时候完成加载动作。
@SpringBootApplication
@ServletComponentScan
@Slf4j
public class shuaideyaosiApiApplication {
@Autowired
private SysConfigDao sysConfigDao;
@Autowired
private SystemConstants constants;
public static void main(String[] args) {
SpringApplication.run(EmosWxApiApplication.class, args);
}
@PostConstruct
public void init() {
List<SysConfig> list = sysConfigDao.selectAllParam();
list.forEach(one -> {
String key = one.getParamKey();
key = StrUtil.toCamelCase(key);
String value = one.getParamValue();
try {
Field field = constants.getClass().getDeclaredField(key);
field.set(constants, value);
} catch (Exception e) {
log.error("执行异常", e);
}
});
}
}