繁体   English   中英

Tomcat的行为就像没有在处理线程请求一样,导致响应时间变慢

[英]Tomcat behaves as if it's not threading requests, causes slow response time

我看到了奇怪的行为,而且我不知道如何获得进一步的了解,并希望有人可以提供帮助。

背景:我有一个查询,查询返回结果要花费很长时间,因此我没有使用户根据请求直接等待数据,而是定期通过Timer对象执行此查询并将结果存储在静态变量中。 因此,当用户请求数据时,我总是总是从静态变量中拉出数据,因此实际上使响应迅速。 到现在为止还挺好。

问题:不过,我所看到的行为是,如果我在后台(Timer)请求开始查询数据的同时对数据进行请求,则我的用户请求将等待数据返回,然后进行响应-迫使用户等待。 好像tomcat与线程同步运行一样(我知道不是-只是那样)。

这是在生产环境中进行的,大部分情况下一切正常,但是对于用户而言,有时网站只是为他们而挂起,他们觉得它不可靠(从某种意义上来说是这样)。

我所做的:由于对数据的请求是在静态方法中,所以我认为“啊!线程被同步化,这导致了延迟!” 因此我退出了所有静态方法,删除了同步,并强制每个调用实例化其自己的对象以检索数据(以确保其线程安全)。 信号量与静态变量之间也没有任何同步。

我还安装了javamelody,以尝试了解正在发生的事情,但到目前为止没有新内容。 我注意到很多(大多数)线程处于“等待”状态,但是它们还有0ms的用户和CPU时间,所以不要认为这指向任何东西(?)。

运行Tomcat 5.5(无Apache层),struts 2,Java 1.5

如果有人知道为什么对静态变量的简单请求会挂起较长的后台进程,我将不胜感激! 或者,如果您知道我如何获得洞察力,那也将很棒。

谢谢!

一种可能的解释是,由于长时间运行的查询引起的数据库锁定(或其他原因),线程实际上在数据库级别处于阻塞状态。

弄清楚正在发生什么的方法是确切地找出被阻塞的线程在哪里阻塞。 可以通过将SIGQUIT(或等效方法)发送到JVM以及所有Java线程堆栈的堆栈跟踪来生成线程转储。 另外,您可以通过附加调试器等获得相同的信息(甚至更多)。 无论哪种方式,每个堆栈顶部框架的类名和行号都应允许您查看源代码并找出(至少)发生了哪种锁定或阻塞。

对于那些想知道的人,我最终找到了VisualVM( http://visualvm.java.net/download.html )。 这是完美的。 我像往常一样从eclipse运行Tomcat,它出现在VisualVM客户端中。 右键单击tomcat图标,选择“ Thread Dump”,繁荣,我已经掌握了一切。

谢谢大家的帮助和正确方向的指点!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM