#java #mysql #jsp
#java #mysql #jsp
Вопрос:
У меня есть веб-приложение J2EE, которое выполняется на общем сервере Tomcat. Иногда веб-сайт никогда не загружается, это занимает почти 5-10 минут! За это время она никогда не загружается и не показывает никаких ошибок, и после многократных попыток она, наконец, показывает ошибку: (111) connection refused
. Я не знаю, в чем причина. Кто-нибудь может сказать мне, в чем может быть проблема? Это мое приложение или хостинговая компания? Кстати, веб-сайт продолжает работать в течение 1,2 дней, а затем происходит описанный выше сценарий.
Приложение является JSP и использует Hibernate для подключения к базе данных MySQL.
Комментарии:
1. Сгенерирована трассировка стека?
2. смотрите файлы журнала. Какую ошибку вы там обнаружили?
3. @dave: ip и порт указаны правильно?
4. На самом деле я имел в виду, можете ли вы ПРИНУДИТЕЛЬНО создать дамп?
5. Хороший совет от MJB, есть ли у вас возможность запустить команду ‘jstack’ и сгенерировать дамп потока?
Ответ №1:
Попробуйте запустить команду jstack на сервере, как только он зависнет. Команда создаст очень полезный дамп ваших запущенных (или заблокированных) потоков, и вы сможете выяснить, что вызывает проблему.
Комментарии:
1. Неудобно работать с общим контейнером.
2. Jep… но впоследствии вы можете выполнить поиск по имени вашего пакета (ов) в трассировках стека и найти важные из них. Подключение к отладчику, вероятно, будет невозможно в общем контейнере.
3. Кроме того, инструментарий может изменить то, что наблюдается; увы, это особенно вероятно при такого рода проблемах.
4. спасибо, но я не думаю, что смогу использовать эту команду на общем сервере, потому что не разрешен ssh или любой другой вид сценариев
Ответ №2:
Я наблюдал нечто очень похожее на это с моим сервером развертывания, и у меня еще не было возможности разобраться с этим должным образом (на этом сервере установлена только JRE, а не полный JDK, и он также защищен брандмауэром). Из просмотра журналов я знаю, что это, по-видимому, просто зависает на этапе инициализации (основного) веб-приложения, и больше ничего не происходит в течение этого времени (из просмотра системных журналов; вся система находится в состоянии покоя в то время, когда никакие процессы не могут быть запущены), и я знаю, что это происходит только при загрузке всего контейнера, а не при установке веб-приложения в уже запущенный контейнер.
Это заставляет меня предположить, что проблема связана с каким-то неприятным взаимодействием между средой выполнения Java и интенсивной загрузкой классов, происходящей внутри веб-приложения. Например, если есть JIT-данные, которые сбрасываются GC из слабой хэш-карты до того, как она действительно будет завершена, это может подтолкнуть все к более медленному прохождению кода с (многими) дополнительными состояниями ожидания. (Я охотился за подобными вещами в прошлом; их очень трудно отследить, потому что все по-прежнему работает правильно, хотя и неоптимально, и это вполне может быть проблемой на многих уровнях приложения.)
Мой лучший совет —
- будьте осторожны с порядком загрузки (например, убедитесь, что база данных запущена и стабильна, прежде чем запускать Tomcat)
- не используйте динамическую / отложенную загрузку веб-приложений (это нарушает воспроизводимость)
- будьте терпеливы: не пытайтесь получить доступ к веб-приложению, пока оно не укажет, что оно готово (если можете, заблокируйте подключения к экземпляру Tomcat, пока он не вызовет все веб-приложения внутри него).
Ответ №3:
я, наконец, нахожу проблему :
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 устанавливал все больше и больше подключений к базе данных, и это делало базу данных невосприимчивой 🙂