views:

56

answers:

2

I'am encountering a problem with my Web Apps and cannot find any answers on the web.

I have a Java Web App that works on parallel with tomcat and apache using mod_jk.

Everything works fine, but after one day of running in tomcat, one of my main servlet doing ajax request stop working. All the others work fine. By this i mean that i am doing ajax request on other servlet and they work fine.

Wierd thing is that it works for a day and then stop the next one (i must than reload my WebApps to make it work again).

I really don't have any clue or idea from where to start investigating this problem.

Could you gentle developpers give me a hint or two please ? :)

+4  A: 
  • You may look at your server logs.
  • You may use a browser addon like Live HTTP Headers to check the status of your ajax request(any http requests for that matter)
  • If you are using a IDE, start the server in debug mode and debug your servlet and troubleshoot from there on.
chedine
Probably apache and tomcat are both producing logs, so check them both.
Todd Owen
A: 

Since you tagged SQL as well, I strongly suspect that your webapp is leaking SQL connections. I.e., your webapp is getting a connection and keeping it open all the time and never closing it. Because the connection is been too long open, the DB will force a timeout and close of the connection after a certain period. E.g. MySQL will do that after 8 hours. Reloading the webapp will cause a new connection been acquired and hold. But this doesn't fix the actual problem.

This issue is pretty common among new-to-webapp (and new-to-database) developers.

All you need to do is to rewrite your JDBC code so that it properly acquires and closes the Connection (and Statement and ResultSet) in the shortest possible scope. You also need to use a finally block to ensure the close for the case an exception is been thrown. Here's a kickoff example:

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;
}

If you want to improve connecting performance, then you should consider using a Connection Pool instead of keeping the connection all the time open.

See also:

BalusC