response.flushBuffer()不起作用

Mad*_*dhu 6 java streaming servlets blob oracle11g

我正在尝试实现一个用于流式传输大型对象的servlet:

    oracle.sql.BLOB blob = rs.getBLOB('obj');
    InputStream in = blob.getBinaryStream();

    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];

    ServletOutputStream out = response.getOutputStream();

    int counter=0
    while((length=in.read(buffer)) != -1){
        out.write(buffer,0,length);
        counter++;
        if(counter % 10 == 0){
        counter=0;
        response.flushBuffer();
    }
Run Code Online (Sandbox Code Playgroud)

此代码假设通过chunck将数据发送到客户端块.现在发生的事情是,当我传输大对象(100 MB)时,内存会上升,如果有多个并行下载/流,服务器有时会死掉.

为什么这flushBuffer()不是向客户端发送数据?只有在响应关闭后,客户端才会弹出打开/保存文件.

Ern*_*ill 3

您必须Content-Length在写入数据之前设置标头,否则服务器将被迫缓冲所有数据,直到流关闭,此时它可以自行计算值,写入标头并发送所有数据。一旦获得输出流,在写入任何数据之前,请设置内容长度:

response.setHeader("Content-Length", String.valueOf(blob.length()));
Run Code Online (Sandbox Code Playgroud)

大多数服务器都足够聪明,可以在此时自行刷新缓冲区,因此您可能甚至不需要调用flushBuffer()- 尽管这没有什么坏处。