记一次使用SQL server读取加同步数据的实践过程

336 阅读2分钟

这是我参与更文挑战的第8天,活动详情查看: 更文挑战

问题总结

SQL server,怎么是你

我们这边产生的订单都属于线上订单,所有的订单数据也都是线上的订单的数据。不论是区域主管、还是柜台主管等等销售人员需要在后台随时查看业绩看板的统计数据,业绩看板的订单统计就不仅仅涉及线上订单,还包括线下订单。线下订单都是存在柜台品牌方的数据库中,也就是外部第三方那里在管理。我们需要将第三方数据做全量同步,以及后续增量定时更新过来。

在和对方确认好数据逻辑,定义好数据模型后。对方把数据库地址甩了过来。登上库一看,SQL server,而且还是视图。

你真是个拦路虎

我们包括周围小伙伴用的都是 mysql,再不济顶多就是 MongoDB 。谁会用 SQL server ,还有视图要怎么用?不过这些都不是什么问题,毕竟只是查询语法上的一些细微区别。包括数据库连接要更换驱动,数据持久层的语法要换成 SQL server ,这些问题也不大。稍微复杂点的是之前项目里直连的 MongoDB ,配置的 MySQL ,现在接了 SQL server ,要接多数据源的配置。

扑通一声掉进坑

好基本上框架问题都解决了,开始实际操作数据库了。

int countDatas = repository.count(startDate, endDate);
final int size = 1000;
int page = countDatas / size + 1;
logger.info("sync data countDatas:{} page:{}", countTxDetails, page);
for (int i = 0; i < page; i++) {
    List<Entity> entitys = repository.findDatas(startDate, endDate, size, i * size);
    logger.info("sync data:{} , size:{}", i, txDetails.size());
    for (Entity entity : entitys) {
        mongoTemplate.save(salesView);
    }
    entitys = null;
}

然后就开始跳坑了。因为是分页查询,需要让数据保持一定的顺序。对方因为涉及数据隐私,用限制很多权限的视图方式展示,只保留了需要用到的业务字段,没有主键!没有主键!没有主键!在和对方沟通后,对方加上了主键。于是,先同步个 5000 个量。嗯??只同步了不到 4000 。咦,本地自测的时候 放的是 500 的模拟数据,全部一个不少的入库了。继续哼哧哼哧的把这个流程捋了几遍。。

大败拦路虎,满星完胜

说出来问题的核心,真的很无语。对方在视图里放的主键是每次读数据时自动 UUID 出来的。查到这个问题过程中也涉及了一些通用查问题的技巧,就不在这篇文章里展开了,此篇只做这次问题的记录文。