兩個重要的事情要檢查這種問題:
讀取服務器日誌的任何異常和蹤跡。在Tomcat中它位於/logs
文件夾中。如果你找到了,那麼這些應該提供足夠的信息來解決你自己的問題。但是如果你不明白原因,那麼你需要更新你的問題以包含相關的異常和堆棧跟蹤。這樣我們可以幫助解釋原因,以便解決方案足夠明顯。
確保代碼不在任何地方吞嚥重要的異常。即你至少需要在捕捉後重新拋出或記錄它們。例如。因此不:
try {
// ...
} catch (SQLException e) {
}
但越是這樣:
try {
// ...
} catch (SQLException e) {
throw new ServletException(e);
}
或者,至少:
try {
// ...
} catch (SQLException e) {
e.printStackTrace();
}
這樣,他們將被記錄到服務器日誌。
之一,其涉及你的具體情況首先想到的事情是,代碼不finally
塊正確關閉數據庫資源和DB從而耗盡資源,從而導致失敗的連接,準備聲明和/或執行查詢。通過適當的異常處理,這應該已經暗示在服務器日誌中。這裏有一個基本的開創性例子,如何正確編寫JDBC代碼。通常的做法是獲取和最短的範圍內關閉數據庫資源:
public List<Entity> list() throws SQLException {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
List<Entity> entities = new ArrayList<Data>();
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 in reversed order.
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 entities;
}
上close()
任何異常可以忽略不計,但我更喜歡記錄它們,這樣你就不會丟失故障的任何證據的任何地方,即使它很小。