环境:查询数据库为一个微服务,同步到es中为另一个微服务,同步微服务调用查询微服务进行数据的同步
思路:
①每次从第一条数据开始查询,每次查询500条数据返回,进行同步
②当查询的结果为0时,返回null
③当查询结果数小于500时,代表数据库已经查询完毕
查询微服务的mapper接口方法
/**
* 查询大于当前id的500个数据,且为上架状态 同步到es中
* @param skuId
* @return
*/
@Select("select * from tb_sku where id>#{skuId} and status='1' limit 500")
List<Sku> findByStatusAndId(Long skuId);
查询微服务 查询的结果数为0,数据库查询完毕直接返回null
public List<Sku> findByStatusAndId(Long skuId) {
List<Sku> skuList = skuMapper.findByStatusAndId(skuId);
//查询的结果数位0,返回null
if (skuList.size()==0){
skuList=null;
}
return skuList;
}
同步微服务 数据库的第一条数据大于0,否则第一天数据查询不到
@Override
public void importDate() {
Long skuId=0L;
while (true){
//调用goods微服务查询所有已经上架的产品 同步到es中
Result<List<Sku>> skuByStatus = goodsFeign.findSkuByStatus(skuId);
List<Sku> skuList = skuByStatus.getData();
if(skuList==null){
//全部结果查询完毕
break;
}
//skuId更改为查询集合中最后一个元素的id,查询下一个500条数据
skuId=skuList.get(skuList.size()-1).getId();
//将查询的数据封装到与elasticSearch映射的javabean 集合中
//先将查询集合转为json字符串,再转换为javabean集合
List<SkuInfo> skuInfos = JSON.parseArray(JSON.toJSONString(skuList), SkuInfo.class);
//skuInfos集合数据同步到es中
searchMapper.saveAll(skuInfos);
if (skuList.size()<500){
//当前查询结果数据量小于500,代表全部结果查询完毕
break;
}
}
}