我遇到了Web应用程序的问题,但无法在网络上找到任何答案。
我有一个Java Web 适用于并行工作的应用程序 使用mod_jk的tomcat和apache。
一切正常,但在一个之后 在tomcat中运行的一天,我的一个 执行ajax请求的主servlet停止工作。一切 其他人工作正常。我的意思是我在其他servlet上做ajax请求,它们工作正常。
奇怪的是它适用于 一天然后停下一个(i 必须重新加载我的WebApps 它再次工作)。
我真的没有任何线索或想法 从哪里开始调查 这个问题。
温柔的发展者可以给我一两个暗示吗? :)
答案 0 :(得分:4)
答案 1 :(得分:0)
由于您也标记了SQL,我强烈怀疑您的Web应用程序正在泄漏SQL连接。即,您的webapp正在建立连接并始终保持打开状态,并且从不 closing它。由于连接打开时间过长,因此DB会在一段时间后强制超时并关闭连接。例如。 MySQL将在8小时后完成。重新加载webapp将导致获取并保持新连接。但这并不能解决实际的问题。
这个问题在new-to-webapp(和新数据库)开发人员中很常见。
您需要做的就是重写JDBC代码,以便正确获取并关闭Connection
(以及Statement
和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;
}
如果您想提高连接性能,那么您应该考虑使用Connection Pool而不是一直保持连接打开。