2011-03-31 100 views
1

我与基于Spring MVC的应用程序部署在JBoss-4.2.3.GA下,希望澄清servlet输入/输出流如何处理巨大的请求/响应正文。我很担心这个问题,因为不想在内存中保留整个请求/响应,直到调用完成。JBoss输入/输出流

如何检测JBoss传递给servlet的确切输入/输出流实现?或者我可以在某种规范中调查它的行为吗?

感谢有关它的任何有用的信息。

回答

1

servlet API在默认情况下不会将整个请求和响应主体保留在内存中。这是有效的你自己的处理/解析代码。

至于请求机构,在处理它时,你不应该把整个机构放在byte[]。一个byte[]的每个字节消耗,是的,一个字节的Java内存。您应该尝试(重新)编写代码,使其永远不会将整个主体保存在内存中。例如逐行或逐缓冲地处理它,和/或立即将其流化为OutputStream

E.g.当人体基于字符:

BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8")); 
PrintWriter writer = new PrintWriter(new OutputStreamWriter(someOutputStream, "UTF-8")); 

for (String line; (line = reader.readLine()) != null;) { 
    processIfNecessary(line); 
    writer.writeln(line); 
} 

或当身体字节基于:

BufferedInputStream input = new BufferedInputStream(request.getInputStream()); 
BufferedOutputStream output = new BufferedOutputStream(someOutputStream); 
byte[] buffer = new byte[1024]; // 1KB buffer. 

for (int length; (length = input.read(buffer)) > 0;) { 
    processIfNecessary(buffer); 
    output.write(buffer, 0, length); 
} 

至于响应机构,将保存在存储器中,直到缓冲区的大小。超出缓冲区大小的任何内容都将被刷新。默认的缓冲区大小通常是2KB。这可在应用服务器级别和ServletResponse#setBufferSize()进行配置。当您将缓冲区大小设置得太高时,会吞噬内存。