Загрузка файла сервлета для миллионов строк - PullRequest
0 голосов
/ 26 июня 2019

Webapp, чтобы предоставить отчет CSV для пользователя, чтобы загрузить. У меня проблема, когда в таблице миллионы строк, чтобы записать ее в ответ.

Я попытался выбрать пакетно (используя rowNum), поскольку помещение слишком большого количества объекта в массив приводит к проблеме нехватки памяти. Но, тем не менее, установка слишком большого количества данных в stringbuilder также приведет к нехватке памяти.

Вот код, используемый для загрузки CSV:

    public void downloadCSV(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    long totalRecordCnt = getTotalRecords(batchId, ...);
    int range = 10000;


    BufferedOutputStream bos = null;
    try {
        StringBuilder tableStr = new StringBuilder();
        bos = new BufferedOutputStream(response.getOutputStream());
        tableStr.append('\ufeff');
        tableStr.append("\"" + ....);

        tableStr.append("Batch ID" + ","
                +"User Name" + "," + "Acc balance" + "\n");

        // split the records into smaller batch to process
        if (totalRecordCnt > 0) {

            long totalBatchCnt = totalRecordCnt / range;
            if (totalRecordCnt % range > 0) {
                totalBatchCnt += 1;
            }

            long totalRecordCntTemp = totalRecordCnt;
            for (int i = 1; i <= totalBatchCnt; i++) {
                long endRange = 0;
                long startRange = ((i - 1) * range) + 1L;
                if (totalRecordCntTemp < range) {
                    endRange = totalRecordCnt;
                } else {
                    endRange = startRange + range - 1;
                }

                totalRecordCntTemp = totalRecordCntTemp - range;

                // process records
                List<Account> account = null;

                account = getAccountList(batchId, startRange,endRange);


                if (account != null && !account.isEmpty()) {
                    for (Account acc : account) {

                        tableStr.append("\"" + acc.getBatchId + "\",\"" + accnt.getName
                                + "\"" + "\n");

                    }
                }
            }
        }

        // setting some response headers
        response.setHeader("Expires", "0");
        response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        response.setHeader("Pragma", "public");
        // setting the content type
        String csvFileName = "Acc_report" + ".csv";
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment; filename=" + csvFileName);

         bos.write(tableStr.toString().getBytes());// Write individual
        // field
                                                  // followed
        bos.flush();
    } catch (Exception e) {
        throw new IOException(e.getMessage());
    } finally {
        if (bos != null) {
            try {
                bos.close();
            } catch (Exception e) {
            }
        }
    }

}

Ожидается: чтобы можно было генерировать отчет, содержащий миллионы строк, сразу после нажатия на кнопку загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...