我有一个带有doPost方法的Java Servlet,当doPost完成时,我假设Glassfish会关闭连接,但我错了。 Servlet位于Linux服务器上,经过300次发布后,线程计数返回:
ps -eLFU glassfish | grep domain1 | wc -l
362
在任何帖子之前,线程数是72.响应都是成功的但我不明白为什么Glassfish没有关闭连接。我正在使用Glassfish的默认配置。
我试图解决这个问题的原因是当我的servlet在某些时候被点击时我在Linux服务器上出现了这个错误:
su: cannot set user id: Resource temporarily unavailable
在/etc/security/limits.conf中我有这个:
glassfish hard nproc 4192
glassfish soft nproc 2024
我不想更新limits.conf,而是尝试确保它不会达到这些数字。
答案 0 :(得分:1)
glassfish是否保持连接打开?还是线程正在运行?他们是不同的东西。可能会启动线程,而不是在将来关闭以服务新连接。这是标准行为。你可以使用“kill -3 PID”进行线程转储,其中PID是glassfish进程的进程ID吗?这会将所有正在运行的线程转储到标准输出,您可以看到每个线程正在做什么。在那里,您将能够看到它是否卡在您的代码中或等待新连接。您可以找到有关如何获取线程转储的更多信息here。
答案 1 :(得分:0)
发现问题是代码问题。 servlet使用客户端来调用Web服务,客户端需要是单例。最初我每个POST都为servlet创建一个客户端,它在glassfish下创建了很多线程。一旦我让客户端成为单身人士,线程数就会大幅下降。