在同步服务中,数据的获取通常是第一步,例如从数据库、API 或其他数据源中拉取数据。然而,开发者有时会忽略对获取数据的有效性进行检查,直接进入下一步操作(如更新数据或删除旧数据)。如果数据获取失败或返回空值,可能会导致后续操作异常,甚至引发数据丢失或系统崩溃。
一个定时 job 需要每天从海康远程 API 获取视频列表数据,然后更新本地数据库。如果未检查 API 返回的数据是否为空或是否符合预期格式,可能会导致以下问题:
log.info("开头同步海康数据");
ArtemisConfig artemisConfig = GetArtemisConfigInfoConfigByKey(); //读取配置 hikconfig
HikRequest hikRequest = new HikRequest();
String first = hikRequest.SendCameras(1, 10, artemisConfig);
//log.info("获取总数据的内容是"+first);
JSONObject jsonObject = JSON.parseObject(first);
String code = jsonObject.getString("code");
if (code.equals("0")) {//判断能获取数据
//log.info("获取总数据成功");
JSONObject data = jsonObject.getJSONObject("data");
Integer total = data.getInteger("total");
log.info("获取总数据是"+total);
Integer pageSize = 1000;
Integer totalPage = (total + pageSize - 1) / pageSize;
Integer pageNo = 1;
String connStr = param;
DataTemplate postgresqlDataTemplate = DatabaseUtil.getDataTemplate(DataSourceType.POSTGRESQL.toString(),
connStr
);
while (pageNo > maps = hikRequest.GetCameraList(result);
if (!maps.isEmpty()) {
log.info("获取" + maps.size() + "条数据");
hikRequest.SaveCameraList(maps, postgresqlDataTemplate);
pageNo++;
} else {
log.info("获取 0条数据");
break;
}
}
//删除更新时间是前天的数据;
LocalDate yesterday = LocalDate.now().minusDays(30);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = yesterday.format(formatter);
String sql = "delete from hik_camera where data_update_time
具体流程如下:
然而,之前的实现存在问题:
在进行数据同步的同时,没有考虑到数据是否有获取同步到对应的数据库,就进行了数据的删除。
在同步服务中,数据获取的有效性检查是至关重要的环节。未进行充分的检查可能导致数据丢失、系统异常等问题。通过加强异常处理、事务管理以及日志监控,可以有效降低风险,确保同步流程的稳定性和数据一致性。
参与评论
手机查看
返回顶部