Динамически записывать CSV-файл в ответ сервлета OutputStream - PullRequest
0 голосов
/ 05 сентября 2018

У меня более 1 миллиона данных в БД. Мне нужно читать из 1000 строк БД одновременно и записывать их в OutputStream до тех пор, пока не будут возвращены данные. Я не уверен, сколько данных может быть. Так что я не знаю длину файла, пока не достигну конца данных.

Возможно ли, чтобы записывать данные в выходной поток партиями, которые должны передаваться в сеть одновременно. Я пытаюсь добиться здесь избегания из памяти. Если я сохраню 1 миллион данных в выходном потоке, то получится OOM. поэтому, чтобы избежать OOM, я пытаюсь записать данные в сеть, и они не должны храниться в какой-либо памяти JVM, они должны записывать в сеть, как только я их получу. То, что я написал код, пока здесь.

Примечание: это отдельный код.

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    String header = "Doc Timestamp,Internal DocID,DocType,Sender,Receiver,Routing Status,User Status,External DocID\n";
    resp.setHeader("Content-Disposition", "attachment; filename="+"File.csv"); 
    resp.setContentType("text/csv");

    OutputStream stream = resp.getOutputStream();
    stream.write(header.getBytes());
    stream.flush();

    for (int i = 0; i < 10000000; i++) {
        String docTimeStamp = new Date().toString();
        String docid = UUID.randomUUID().toString();
        String docType = "ICSCSRin";
        String sender = "ACC15796_CWS";
        String receiver = "ACC15794_CWS";
        String routingStatus = "DONE W/ ERRORS";
        String userStatus = "CWS POST_PROCESS";
        String snrf = "CWS_TES";
        StringBuffer str = new StringBuffer();
        str.append(docTimeStamp).append(",").append(docid).append(",").append(docType).append(",").append(sender).append(",").append(receiver).append(",").append(routingStatus).append(",").append(userStatus).append(",").append(snrf).append("\n");
        stream.write(str.toString().getBytes());
    }
    stream.close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...