Tomcat 6默认缓冲区大小

时间:2008-12-23 04:56:45

标签: java jsp tomcat

有没有办法在Tomcat中为JSP设置默认缓冲区大小?我知道我可以在每一页上设置它们,但我希望在某个地方有一个全局选项。

2 个答案:

答案 0 :(得分:3)

简短回答:不。

答案很长:或许,有些黑客......

  • 编辑此课程后,您必须自己构建Tomcat:Jasper constants
  • ...或者你可以做一个Perl派,并一次编辑所有的JSP。首先备份,因为这是在线编辑:

对于没有设置缓冲区的指令:

/usr/bin/perl -pi -e 's|<%@ page|<%@ page buffer="new" |g' `find . -type f -name '*.jsp'`

对于已设置的缓冲区:

/usr/bin/perl -pi -e 's|buffer="old"|buffer="new"|g' `find . -type f -name '*.jsp'`

(如果您的指令与上述内容不一致,例如更多/更少的空格,请使用更多正则表达式魔法使其正常工作)

您在网络其他地方的问题:http://www.theserverside.com/discussions/thread.tss?thread_id=24768

HTH

答案 1 :(得分:2)

编辑:要将评论讨论提升到这个答案 - 这可能就是你所追求的

即使没有处理(控制器)和视图(jsp)的分离,当你仍然坚持使用遗留应用程序时,你应该将处理限制在jsp的最初指令上,例如:就在上面。在那里你甚至可以自由地重定向(例如发送回响应代码302),更不用说用正确的错误代码发出错误信号。也就是说,无论如何,您应该避免向客户提供500种样式错误。而是提供漂亮的html页面(200),向客户显示有用的错误消息。应用程序应在其级别上显示错误,而不是在协议级别上显示。

我记得,在上个世纪,我自己也在研究过这样的应用程序。我们遇到了一些平台差异:一个平台甚至没有缓冲第一个字节,但立即将其发送回客户,使我们的重定向尝试(代码302)无用,因为200代码标头已经在它的路上了。唯一有帮助的是确保在处理之前不能发送单个字节。由于我们需要一些taglib,我们必须消除taglib指令之间的换行符。有两种方法可以做到这一点:

而不是

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<% /* your processing instructions here */ 
   response.sendRedirect("somewhere.jsp") %>

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" 
%><%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt"
 %><% /* your processing instructions here */ 
   response.sendRedirect("somewhere.jsp") %>

或使用jsp注释消除换行符:

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %><%-- 
--%><%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt"%><%--
--%><% /* your processing instructions here */ 
   response.sendRedirect("somewhere.jsp") %>

这可能看起来很难看,但大大降低了服务器刷新缓冲区的危险 - 无论它有多大。

希望这有帮助。


这是在评论讨论之前/期间回答的内容

Tomcat docs for the http connector具有bufferSize,socketBuffer和nio安装的其他几个选项 - 一些用于输入,一些用于输出流。 AJP connector似乎不是可配置的(如果使用Apache / mod_jk,则需要ajp连接器)。

我希望你正在寻找的缓冲区就是......

编辑:(评论空间太小,所以我选择添加一些关于你在这里使用AJP的评论的更多信息:)

关于缓冲区大小的智慧似乎是在org.apache.catalina.connector.OutputBuffer和org.apache.catalina.connector.Response中实现的(简要介绍一下tomcat 6.0.18源代码)。特别感兴趣的是这段代码(来自Response):

/**
 * Set the Connector through which this Request was received.
 *
 * @param connector The new connector
 */
public void setConnector(Connector connector) {
    this.connector = connector;
    if("AJP/1.3".equals(connector.getProtocol())) {
        // default size to size of one ajp-packet
        outputBuffer = new OutputBuffer(8184);
    } else {
        outputBuffer = new OutputBuffer();
    }
    outputStream = new CoyoteOutputStream(outputBuffer);
    writer = new CoyoteWriter(outputBuffer);
}

根据我对这段代码的判断,似乎增加缓冲区大小可能并没有真正帮助你解决问题。不是我想说它没有帮助......当你从jsps增加缓冲区大小时,你是否测量了实际性能?这样做有帮助吗?

通过了解这一联系点,您可以通过修补tomcat源或向Web应用程序添加过滤器或根据您的需要调整缓冲区大小的tomcat容器配置来满足要求。 (我更喜欢任何时候在tomcat补丁上使用过滤器)

我想到的另一个想法是:如果你使用任何模板系统(比如瓷砖,就像你提到jsp,但速度或其他人想到的那样),你不应该有太多的点,你必须从jsps设置缓冲区大小。在我研究过的系统中,我可能会猜到大约10个基本布局模板会受到影响(与项目大小无关)。

我希望这个添加有助于......