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();
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM