我们正在运行一个IBM MDM服务器(initiate),它通过池化机制连接到Oracle DB服务器。池的配置已设置为 32。我们还有一个自定义的 Java 进程,通过 MDM 服务器公开的 API 将数据提交到此 MDM 服务器。一旦我们的自定义 Java 进程(不直接打开任何数据库连接)终止,我们看到 MDM 服务器和 Db 服务器之间的进程数已增加到大于 32 的某个数字。每次夜间运行后,我们看到进程数不断增加,最终达到了 Oracle DB (700) 设置的限制,并且数据库不会允许再向其打开任何连接,并且我们的进程在那天晚上失败。我们试图弄清楚为什么进程没有被终止,为什么它们仍然处于建立模式(根据 netstat 命令)
进程数可能增加和套接字处于"已建立"状态有几个原因。
典型的错误是为每个消息/连接/注册生成一个子进程,而不是重用现有连接。特别是涉及计时器回调
例如,
c - register for timer callback -> server
c -> spawn a process to receive the reply and listen on receive socket
c - register for timer callback -> server -> server
c -> spawn a process to receive the reply and listen on receive socket
相反,它应该是
c - register for timer callback -> server
c -> spawn a process to receive the reply and listen on receive socket
c - set the initialized flag
c - register for timer callback -> server
c -> if initialized do not spawn a process to receive the reply
达到最大限制后系统是否出现任何异常?
创建的进程是否仍然有效?
这些进程是否建立了数据库连接但未终止?
顶部输出是否显示活动进程?
1)清除旧日志。2) LSOF 数据。这是一个操作系统命令,它将告诉我们 应用服务器进程正在使用哪些描述符。 lsof -p PID> lsof.out3)限制。这些是操作系统资源限制 ulimit -a> ulimits.out
请检查打开连接的代码在使用后是否关闭?
检查 lsof 输出和连接类型的状态?
我在IBM担任Java服务工程师。请回答上述问题,以便我们为您提供更好的帮助。