GET请求数据量大造成的问题

在实际的开发过程中,我们偶尔或者遇到过要导出列表中所有的数据。假设列表中有十万条数据,那么导出所有,意味着要大批量的走查询接口,通常我们的后台的API接口GET请求支持的查询长度不得大于1000,(比如我根据一千个用户id查询用户的真实姓名),那么GET请求显然不太支持,解决办法可以使用Post请求。当然如果不改的话其实也有笨方法。如果在实际开发过程中能帮助你解决问题实在是很高兴。解决方法如下。

  • 我们可以把接口请求GET 改为Post ,使用@RequestBody传递参数。
  • 我们可以使用递归的方式进行分批查询。也是解决的方法之一。具体实现如下
    封装了一个工具类
    UserInfoManager
    定义了一个常量 一次性查询3000条
private final Double SEPARATE = 3000D;

  public Map<String, UserInfoDto> getByUserIds(List<String> userIds) {

        if (CollectionUtils.isEmpty(userIds)) {
            return Maps.newHashMap();
        }

        if (userIds.size() <= SEPARATE) {
            return getgUserMapByIds(userIds);
        }

        Map<String, UserInfoDto> all = new HashMap<>(16);
        double x = Math.ceil(userIds.size() / SEPARATE);
        int start = 0;
        int end = 0;
        for (int i = 0; i < x; i++) {
            end = (int) ((i + 1) * SEPARATE);
            end = end > userIds.size() ? userIds.size() : end;
            all.putAll(getgUserMapByIds(userIds.subList(start, end)));
            start = end;
        }
        return all;
    }


    public Map<String, DaPengUserResource> getgUserMapByIds(List<String> userIds) {
      // 根据userIds查询user微服务 
        List<UserInfoDto> userLists = userClient.getUserByIds(userIds);
        if (!CollectionUtils.isEmpty(userLists )) {
            return a.stream().collect(Collectors.toMap(UserInfoDto::getUserId, c -> c));
        } else {
            return Maps.newHashMap();
        }
    }

posted @ 2022-01-14 11:18  烫手的山芋  阅读(1254)  评论(0编辑  收藏  举报