84、一个表的更新,最好是 先比较,判断是否发生了变化。有变化 再更新,比较好
原创
©著作权归作者所有:来自51CTO博客作者FansUnion的原创作品,请联系作者获取转载授权,否则将追究法律责任
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;
}
|