java - response.flushBuffer() 不工作

标签 java servlets streaming oracle11g blob

我正在尝试实现一个用于流式传输大对象的 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();
    }

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

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

最佳答案

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

response.setHeader("Content-Length", String.valueOf(blob.length()));

大多数服务器都足够智能,可以在此时自行刷新缓冲区,因此您可能甚至不需要调用 flushBuffer() —— 虽然这不会造成伤害。

关于java - response.flushBuffer() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10552555/

相关文章:

java - 从JSP调用servlet时出现"HTTP Status 405 – HTTP method GET is not supported by this URL"错误

hadoop - 流数据 [Hadoop/MapReduce] - 挑战是什么?

Gobject 的概念以及我们如何在 gstreamer 应用程序开发中使用它

java - 表达语言。主导变量

java - 我如何处理//tomcat中的URI前缀?

java - 在这种情况下 String.format 会导致性能问题吗?

java - 如何使用 Springboot 在 REST 请求 URL 中将 json 对象作为参数传递

video - ffmpeg 从 m3u8 中选择特定语言的最高质量视频轨道和音频轨道

java - 如何使用 printf -Java 将二维数组的所有元素排列成完美的表格

java - 如何使面板数 = for 循环中的迭代次数