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

标签 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) 应用程序如何处理读取的数据?可能是无法写入磁盘,正在等待其他条件,有线程锁等。

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

关于连接数,你也应该计算半关闭连接,这些TCP状态意味着连接仍然有效

ESTABLISHED
FIN_WAIT_1
FIN_WAIT_2
TIME_WAIT

在 Linux 上:
netstat -ant | grep -E '已建立|FIN_WAIT_1|FIN_WAIT_2|TIME_WAIT' |排序-k 6,6

为了进一步排除故障,建议获取线程和/或堆转储并分析它们。
Another case涉及 TIME_WAIT。

关于java - 池中没有可用连接,netstat 在 Recv-Q 中显示非零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51558424/

相关文章:

oracle - PL/SQL : How to handle timeout for DBMS_AQ. 出列

java - 为每个租户自定义 Spring @Scope

java - Java 左子树中最右边的节点

oracle - 创建新的物化 View 而不清除物化 View 日志

sql - 将多列值合并到一行的一列中 Oracle SQL

java - Heroku 上的 JSP - "Unable to compile class for JSP"

java - 问题 java.lang.Exception : Lock wait timeout exceeded; try restarting transaction

在 Tomcat 中刷新后出现 Angular 404 错误

java - Hotspot的scavenge GC停止运行,只剩下mark-sweep GC

java - 用于为学校项目显示以下模式的 bluej 程序