tomcat离开time_wait连接

时间:2014-07-31 17:42:42

标签: java apache tomcat

我们使用Apache Sever作为前端服务器和后端的Tomcat服务器。前端客户端是一个java swing应用程序。该协议是粗麻布的。

有时我们会收到很多小请求。在执行“nestat -a”时,会有很多TIME_WAIT连接,这些连接会阻止服务器打开新连接。只有与tomcat的连接似乎仍然存在。与apache的连接似乎已关闭。

我们正在使用重写规则将请求转发给tomcat

RewriteEngine On
RewriteCond %{REQUEST_URI} .*\.servlet.*$
RewriteRule ^/(.*)$ http://localhost:8080/$1 [P]

有什么想法吗?

更新:

感谢for your advice

但它仍然无效。每个流都关闭,仍然有这些TIME_WAIT:

if (conn != null) {
    try {
        IOUtils.closeQuietly(conn.getInputStream());
    } catch (IOException e) {
        // do nothing
    }
    try {
        IOUtils.closeQuietly(conn.getOutputStream());
    } catch (Exception ex) {
        // do nothing
    }
    try {
        IOUtils.closeQuietly(((HttpURLConnection) conn).getErrorStream());
    } catch (Exception ex) {
        // do nothing
    }
}

if (conn instanceof HttpURLConnection) {
    ((HttpURLConnection) conn).disconnect();
}

3 个答案:

答案 0 :(得分:0)

在发出请求时,很可能不会关闭Swing应用程序中的输入/输出流。 来自here

  

如果结果是一个InputStream,那么非常重要   InputStream.close()放在finally块中,因为Hessian会   在读取所有数据之前,不要关闭底层HTTP流   输入流已关闭。

答案 1 :(得分:0)

TIME_WAIT是最近关闭的连接的正常状态,它将保留在内核中,以便进行内核定义的超时。你从应用程序那里做了一切。

如果您的连接闪烁太快并且可用端口短缺,您可以调整系统的回收。 Huge amount of TIME_WAIT connections概述了Linux以及基本理论,Tuning Windows for TCP/IP performance列出了相应的Windows参数,并提供了很多简短的解释。

答案 2 :(得分:0)

它不是Tomcat,它是您的操作系统。

操作系统在TIME_WAIT中保持连接,以避免因过快的端口重用而导致的干扰。想象一下,当新连接在同一个端口打开时,来自旧连接的数据包迟到。