在for循环里尽量不要使用查询方法
背景
A表为一张事项基础表,B表为一项事项信息表,B表中x字段关联A表,现需要每天执行一次服务,同步B表中需要的数据,同时需要联查A表中的数据。
问题原因
Job中使用for循环遍历B表,在for循环中联查A表数据,整合后同步。如果A表中数据量非常大,会导致每循环一次就查一次A表效率很低。
解决方案
先查出A表数据,循环封装成Map,Key为两表的关联字段x,value为需要联查的数据。该方法可以保证每次服务只查询一次A表数据,不会每循环一次查询一次。
示例(伪代码)
// 不封装Map
// 先查询到需要同步的B表数据
BRecord bs = service.findB(); //BRecord b表实体 service.find() 需要同步的B表数据
// 遍历Bs
for(BRecord b : bs){
// 根据B表X字段联查AA表数据
ARecord a = service.findARecordsByBx(b.getX()); //ARecord a表实体
// 同步
........
}
// 封装Map
Map<String, ARecord> aMap = new HashMap<>();
// 查询A表数据
ARecord as = service.findA();
for(ARecord a : as){
// 循环封装成Map,Key为两表的关联字段x,value为需要联查的数据
aMap.put(a.getX(),a);
}
// 遍历Bs
for(BRecord b : bs){
// 根据B表X字段查AA表数据
ARecord a = map.get(b.getX());
// 同步
........
}