我们已经有很多通过Tomcat运行的使用hibernate / mysql的web服务。 我怀疑其中一些configuration不正确的连接池,因为几个小时后,一些单独的应用程序用完连接并停止响应。 我们一直在对连接池服务进行更改(在本例中为C3P0),但我们仍然需要在服务器上保留旧版本的应用程序以实现向后兼容。
无论如何,我怀疑这些应用程序也会伤害到tomcat的整体稳定性。 大约每周一次,我们的服务器完全停止响应,甚至无法提供静态页面。 重新启动服务后,再过几天再次运行。 通过日志查看几乎没有任何未捕获的exception,所以我不知道是什么会导致tomcat崩溃。 可悲的是,在服务器退出响应之前,错误日志中没有列出任何显着的东西。
我们也在考虑转换到JBoss,因为它有点“企业化”,但我不相信它会解决这些问题。 是否有任何令人信服的理由来切换networking平台,还是应该在我们自己的Web应用程序进一步debugging? 另外,webapp是否有可能通过做坏的事情来使应用程序服务器崩溃?
服务器configuration:Windows 2003 Server,Tomcat 6.0.18 + blazeDS 3.0,Hibernate 3.2。
我不认为有人会为你的问题find答案 ,但只有领导和想法。 这里有一些:
你需要机器人来检查你的服务的每个部分的健康状况 。 (testing一个连接到数据库,获得一个静态网页,获得一个dynamic的网页…)。 这样,你会看到什么先破坏或响应时间增加。
你有监控/统计服务吗? 你需要跟踪“活动数据库连接数量”,“活动networking会话数量”,“tomcat线程数”,“可用内存”,CPU …
我的build议,没有tomcat进程,因为他们都等待资源(可能是数据库连接,或者他们只是一个无限循环!)。 我列出的工具一定会帮助您了解为什么您的服务器每周慢慢死去。
netstat并查看数据库服务器的连接数(并根据您的池大小和数据库服务器容量进行检查)。 如果提供静态页面不需要任何数据库访问,那么这似乎不太可能是数据库资源问题。 这可能是所有的池线程卡在某处,如等待数据库驱动器或死锁。 我要做的第一件事就是用jstack获取堆栈跟踪的快照。 您可以使用visualvm或jconsole进一步查看过程。
只是想补充说,MyISAM表的表locking问题很常见,可能会导致数据库连接堆积并导致应用程序等待这些结果坐下来。
您可能希望查看MySQL进程列表以查看是否有大量查询处于locking状态。
# mysqladmin processlist
– 要么 –
mysql> show processlist;
如果locking是问题,则需要查看是否将问题表上的存储引擎从MyISAM更改为InnoDB是可行的。
如果你安装了lambda探针 webapp(得到1.7testing版),你可以得到线程级别的监控; 关注这个会告诉你什么时候线程停滞在等待数据库,以及其他一些有用的诊断。
这有点旧,但在最近的tomcat版本中仍然正常工作。