Java response.flushBuffer()不工作
我正在尝试实现一个用于流式处理大型对象的servlet: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();
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())代码>