1、观点:一个表的更新,最好是 先比较,判断是否发生了变化。

有变化 再更新,比较好。

2、现象:项目刚刚启动,就大量的update语句。

本来想调试看看某个地方的sql语句。

3、场景

很多数据库表,有定时更新的需求。

比如,A系统维护客户,为了解耦或效率,同步到了B系统。

但是,偶尔会变化,因此会定期更新,但更新并不是频繁。

更新方法1:全量更新+mq更新

更新方法2:定时全量更新。但,update语句太多,很容易导致数据库慢,系统慢。如果数据有几百万条,咋整?

解决办法:先比较。如果发生了变化,再更新。

而大部分数据不会经常变化,这样更新语句很少,瞬间完成更新。

private void doRefresh(List<PmProduct> dataList) {
List<PmProduct> dbList = dbList();
Map<Integer, PmProduct> dbMap = ListKit.listToMap(dbList, PmProduct::getProductionId);
for (PmProduct pmProduct : dataList) {
boolean exist = exist(pmProduct, dbMap);
if (exist) {
Integer productId = pmProduct.getProductionId();
PmProduct dbPmProduct = dbMap.get(productId);
boolean changed = changed(dbPmProduct, pmProduct);
// 发生变化才更新
if (changed) {
doUpdate(dbPmProduct, pmProduct);
}
} else {
// 首次添加,就第1次出现的时候
doSave(pmProduct);
}
}
}
private boolean changed(PmProduct dbPmProduct, PmProduct pmProduct) {
boolean productionNameChanged =
StringKit.notEquals(dbPmProduct.getProductionName(), pmProduct.getProductionName());
boolean productionChineseNameChanged =
StringKit.notEquals(dbPmProduct.getProductionChineseName(), pmProduct.getProductionChineseName());
return productionNameChanged || productionChineseNameChanged;
}