该应用程序使用 Apache Server 作为 Web 服务器,使用 Tomcat 作为应用程序服务器。
可以从 UI 触发操作/请求,这可能需要一些时间才能从服务器返回,因为它会执行一些处理,例如从数据库中获取数据并对该数据执行计算。该时间取决于数据库中的数据量及其处理数据的持续时间。根据参数,它可能长达 30 分钟到 1 小时或 2 分钟。
除此之外,还有一些其他调用从数据库中获取少量数据并立即返回。
现在,当我有多个,比如 4 或 5 个对服务器的长而重的调用,并且它们当前正在运行时,当我进行一个应该更小的调用并立即返回时,这个调用也会挂起,因为它从来没有到达我的 Controller 。
我无法找到调试此问题或找到解决方案的方法。如果您碰巧知道如何处理此问题,请告诉我。
我正在使用 Spring,以及带 Hibernate 的 c3p0 连接池。
最佳答案
所以我找出了应用程序的问题所在,并考虑分享它以防某个地方的人遇到同样的问题。事实证明,应用服务器或 Web 服务器没有任何问题,从技术上讲,这是浏览器的问题。
我发现浏览器只能对一个域打开有限数量的并发调用。在撰写本文时最新版本的 chrome 是 6。这是所有浏览器为防止 DDOS 攻击所做的事情。
在我的应用程序中,HTTP 调用需要很长时间才能返回,直到计算完成几个 HTTP 调用并发累积,结果,浏览器在第 6 个并发调用后停止发送任何进一步的调用,感觉就像应用程序没有响应。您可以阅读 SO 中浏览器的最大并发调用数。
我认为一个可能的解决方案是轮询或更好的长轮询。我会使用 WebSockets,但我们需要做很多改变。
关于apache - Web 应用程序在多次请求后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37987081/