Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java response.flushBuffer()不工作_Java_Servlets_Streaming_Oracle11g_Blob - Fatal编程技术网

Java response.flushBuffer()不工作

Java response.flushBuffer()不工作,java,servlets,streaming,oracle11g,blob,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();

我正在尝试实现一个用于流式处理大型对象的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();
    }
这段代码假设通过chunck将数据发送到客户端块。现在发生的事情是,当我传输大对象(100MB)时,内存会增加,如果有多个并行下载/流,服务器有时会死机


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

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

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

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

首先,您需要为
servlet
响应提供一个响应头,以便容器可以知道信息结束后的字节数:

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

此外,我使用JOBSS 4.3服务器测试此代码您是否在某处
out.close()
?是的,我在out.close()但未粘贴到此处它是否用于较小的流?如果是的,必须有一些设置来调整这个,我相信将日志级别设置为finest可能会有帮助。我相信这是一个应用服务器配置。请看,我累了。不愉快:-)根据您的偏好,您还可以执行
response.setContentLength(blob.length())