Tomcat和Servlet问题

时间:2010-06-28 08:59:53

标签: java sql ajax jsp tomcat

我遇到了Web应用程序的问题,但无法在网络上找到任何答案。

我有一个Java Web    适用于并行工作的应用程序    使用mod_jk的tomcat和apache。

一切正常,但在一个之后    在tomcat中运行的一天,我的一个    执行ajax请求的主servlet停止工作。一切    其他人工作正常。我的意思是我在其他servlet上做ajax请求,它们工作正常。

奇怪的是它适用于    一天然后停下一个(i    必须重新加载我的WebApps    它再次工作)。

我真的没有任何线索或想法    从哪里开始调查    这个问题。

温柔的发展者可以给我一两个暗示吗? :)

2 个答案:

答案 0 :(得分:4)

  • 您可以查看服务器日志。
  • 您可以使用Live HTTP Headers之类的浏览器插件来检查您的ajax请求的状态(任何http请求)
  • 如果您使用的是IDE,请以调试模式启动服务器并调试您的servlet并从那里进行故障排除。

答案 1 :(得分:0)

由于您也标记了SQL,我强烈怀疑您的Web应用程序正在泄漏SQL连接。即,您的webapp正在建立连接并始终保持打开状态,并且从不 closing它。由于连接打开时间过长,因此DB会在一段时间后强制超时并关闭连接。例如。 MySQL将在8小时后完成。重新加载webapp将导致获取并保持新连接。但这并不能解决实际的问题。

这个问题在new-to-webapp(和新数据库)开发人员中很常见。

您需要做的就是重写JDBC代码,以便正确获取关闭Connection(以及StatementResultSet尽可能短的范围。您还需要使用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;
}

如果您想提高连接性能,那么您应该考虑使用Connection Pool而不是一直保持连接打开。

另见: