我们正在运行IBM MDM服务器(启动),它通过池机制连接到Oracle DB服务器。池的配置已设置为32.我们还有一个自定义Java进程,它通过MDM服务器公开的API将数据提交到此MDM服务器。一旦我们的自定义java进程(不直接打开任何数据库连接)终止,我们就会发现MDM服务器和Db服务器之间的进程数已经增加到大于32的某个数字。每次每晚运行后,我们看到的数量是进程不断增加,最后达到了Oracle DB(700)设置的限制,数据库不会再打开任何连接,我们的进程在那天晚上失败了。我们试图弄清楚为什么流程不会被终止,为什么它们仍处于ESTABLISHED模式(根据netstat命令)
答案 0 :(得分:0)
进程数量增加以及ESTABLISHED STATE中的套接字有几个原因。
典型的错误是为每个消息/连接/寄存器生成子进程,而不是重用现有连接。特别是涉及计时器回调
例如,
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 :(得分:0)
系统在达到最大限制后是否会遇到任何异常?
创建的流程是否仍处于活动状态?
这些进程是否建立了数据库连接但未终止?
Top输出显示活动过程吗?
1)清除旧日志。 2)lsof数据。这是一个操作系统命令,它会告诉我们 应用服务器进程正在使用哪些描述符。 lsof -p PID> lsof.out 3)ulimits。这些是操作系统资源限制 ulimit -a> ulimits.out
请检查打开连接的代码在使用后是否已关闭?
检查输出的lsof和连接类型的状态?
我在IBM担任Java服务工程师。请回答上述问题,以便我们更好地帮助您。