моя страница jsp никогда не загружается

#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 из слабой хэш-карты до того, как она действительно будет завершена, это может подтолкнуть все к более медленному прохождению кода с (многими) дополнительными состояниями ожидания. (Я охотился за подобными вещами в прошлом; их очень трудно отследить, потому что все по-прежнему работает правильно, хотя и неоптимально, и это вполне может быть проблемой на многих уровнях приложения.)

Мой лучший совет —

  1. будьте осторожны с порядком загрузки (например, убедитесь, что база данных запущена и стабильна, прежде чем запускать Tomcat)
  2. не используйте динамическую / отложенную загрузку веб-приложений (это нарушает воспроизводимость)
  3. будьте терпеливы: не пытайтесь получить доступ к веб-приложению, пока оно не укажет, что оно готово (если можете, заблокируйте подключения к экземпляру 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 устанавливал все больше и больше подключений к базе данных, и это делало базу данных невосприимчивой 🙂