Проблемы с Tomcat и Servlet - PullRequest
0 голосов
/ 28 июня 2010

У меня возникла проблема с моими веб-приложениями, и я не могу найти ответы в Интернете.

У меня есть Java Web Приложение, которое работает параллельно с Tomcat и Apache, используя mod_jk.

Все отлично работает, но после одного день бега в кота, один из моих основной сервлет, выполняющий ajax-запрос, перестает работать Все другие работают нормально. Под этим я подразумеваю, что я делаю ajax-запрос к другому сервлету, и они работают нормально.

Странно то, что это работает для день, а затем остановить следующий (я должен, чем перезагрузить мои веб-приложения, чтобы сделать это снова работает).

У меня действительно нет никакой подсказки или идеи с чего начать расследование эта проблема.

Не могли бы вы, нежные разработчики, дать мне подсказку или два, пожалуйста? :)

Ответы [ 2 ]

4 голосов
/ 28 июня 2010
  • Вы можете просматривать журналы вашего сервера.
  • Вы можете использовать аддон браузера, например Live HTTP Headers , чтобы проверить состояние вашего запроса ajax (любые запросы http для этогоВопрос)
  • Если вы используете IDE, запустите сервер в режиме отладки, отладьте ваш сервлет и устраните неполадки с этого момента.
0 голосов
/ 28 июня 2010

Поскольку вы также пометили SQL, я сильно подозреваю, что ваше веб-приложение пропускает соединения SQL.Т.е. ваше веб-приложение получает соединение и постоянно его поддерживает, а никогда не закрывает .Поскольку соединение слишком долго было открыто, БД принудительно установит тайм-аут и закроет соединение через определенный период.Например, MySQL сделает это через 8 часов.Перезагрузка веб-приложения приведет к установлению и удержанию нового соединения.Но это не решает актуальную проблему.

Эта проблема довольно распространена среди разработчиков новых приложений для веб-приложений (и новых баз данных).

Всевам нужно переписать код JDBC, чтобы он правильно получил , а закрывает ConnectionStatement и ResultSet) в кратчайшей возможной области .Вам также необходимо использовать блок finally, чтобы гарантировать закрытие для случая, когда было сгенерировано исключение.Вот начальный пример:

public List<Entity> list() throws SQLException {
    // Declare resources before try.
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<Entity> entities = new ArrayList<Data>();

    try {
        // Acquire resources and query DB in try.
        connection = database.getConnection();
        statement = connection.createStatement("SELECT id, name, value FROM entity");
        resultSet = statement.executeQuery();
        while (resultSet.next()) {
            Entity entity = new Entity(); 
            entity.setId(resultSet.getLong("id"));
            entity.setName(resultSet.getString("name"));
            entity.setValue(resultSet.getInteger("value"));
            entities.add(entity);
        }
    } finally {
        // Close resources in reversed order in finally.
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    // Return result.
    return entities;
}

Если вы хотите улучшить производительность соединения, вам следует рассмотреть возможность использования Пул соединений вместо того, чтобы держать соединение постоянно открытым.

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...