我有一个J2EE Web应用程序,它运行在服务器上的共享Tomcat上。
有时网站永远不会加载,需要大约5-10分钟!它在此期间从不加载或显示任何错误,并且在多次尝试之后,它最终显示错误:(111) connection refused
。
我不知道原因是什么。谁能告诉我问题可能是什么?是我的申请还是托管公司?
顺便说一下,网站持续工作了1,2天,然后发生了上述情况。
应用程序是JSP并使用Hibernate连接到MySQL数据库。
答案 0 :(得分:1)
尝试在服务器挂起时立即运行jstack命令。该命令将为您运行(或阻塞)的线程创建一个非常有用的线程转储,您可以找出导致问题的原因。
答案 1 :(得分:1)
我使用我的部署服务器观察到了非常类似的东西,但还没有机会正确地追逐它(该服务器只安装了JRE,而不是完整的JDK,并且它也非常防火墙)。通过观察日志,我知道它显然只是在(主要)webapp的初始化阶段暂停,并且在此期间没有发生任何其他事情(从观看系统日志;整个系统当时处于静止状态,没有进程可以运行)我知道只有在启动整个容器时才会发生这种情况,并且在将webapp安装到已经运行的容器中时不是。
这让我猜测问题是由于Java运行时与webapp内部密集类加载之间的某种令人不快的交互。例如,如果有一个JIT数据在它真正完成之前被来自弱哈希映射的GC刷新了,那么可能会通过代码将所有内容推送到一些较慢的路径(更多)等待状态。 (我过去一直在寻找这些东西;他们很难非常难以追踪,因为如果不是最佳的话,一切都仍然正常,并且很可能是一个问题的应用程序。)
我最好的建议是
答案 2 :(得分:0)
我终于找到了问题:
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
return new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
正如您在上面看到的那样,getSessionFactory()
方法始终会导致buildSessionFactory()
所以每当我在代码中的任何位置调用hibernateUtil.getSessionFactory()
时,hibernate就会与数据库建立越来越多的连接,它使数据库无响应:)