池中没有可用的连接,netstat在Recv-Q中显示非零值

时间:2018-07-27 12:55:08

标签: java oracle tomcat netstat connection-pool

我有一个旧的Java应用程序正在Tomcat 6上的Java 1.6上工作。由于它在环境中的设置方式,很难进行任何内部诊断-基本上我不能碰它-这是一个黑匣子。

由于缺少免费连接,该应用程序崩溃了。限制设置得很高(最多255个并行连接),但是即使打开的连接数约为60个,它仍然崩溃。

Netstat显示recvQ中有很多数据(仅作为示例):

tcp    1464      0 localhost:7076 remote-host1:3120 ESTABLISHED
tcp    2512      0 localhost:7611 remote-host2:3120 ESTABLISHED
tcp    6184      0 localhost:4825 remote-host3:3120 ESTABLISHED

我找不到关于此案的有用提示(类似的问题在这里:https://serverfault.com/questions/672730/no-connection-available-in-pool-netstat-recvq-shows-high-number)。

问题:
1)为什么应用程序不读取接收到的所有数据?
2)由于未读取所有数据,因此将打开与DB的另一个连接。我说的对吗?

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

1)应用程序如何处理读取的数据?可能是因为它无法写入磁盘,正在等待其他条件,有线程锁等。

2)打开新连接,因为无论recvQ为何,这些连接仍在使用中。

关于连接数,您也应该计算一半关闭的连接,这些TCP状态表示连接仍处于活动状态

  

已建立
  FIN_WAIT_1
  FIN_WAIT_2
  TIME_WAIT

在Linux上:
netstat -ant | grep -E 'ESTABLISHED|FIN_WAIT_1|FIN_WAIT_2|TIME_WAIT' | sort -k 6,6

为进一步解决问题,建议获取线程和/或堆转储并对其进行分析。
Another case涉及TIME_WAIT。