我们正在运行一个 IBM MDM 服务器(启动),它通过池机制连接到 Oracle DB 服务器。池的配置已设置为 32。我们还有一个自定义 java 进程,通过 MDM 服务器公开的 API 将数据提交到此 MDM 服务器。一旦我们的自定义 java 进程(不直接打开任何数据库连接)终止,我们就会看到 MDM 服务器和数据库服务器之间的进程数量已上升到大于 32 的数量。每次夜间运行后,我们看到进程数量不断增加,最终达到 Oracle DB 设置的限制(700),并且数据库不会允许向其打开任何更多连接,我们的进程在当晚失败。我们试图弄清楚为什么进程没有被终止以及为什么它们仍然处于 ESTABLISHED 模式(根据 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
关于linux - 已建立的Linux进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29806729/