2010-05-20 60 views
2

我的一些servlet有一個很奇怪的問題。下面是我的配置:Servlet在一些點擊或時間後停止在Tomcat服務器上工作

  • 文件夾A的部署在Tomcat的目錄的servlet的X號
  • 文件夾B部署在Tomcat的目錄

一定的時間或命中後的servlet的Y個文件夾B中的任何servlet都會停止正常工作,而同時文件夾A的所有servlet都能正常工作。

我無法追查我所犯的錯誤。

這兩個文件夾的servlet的所有編碼都是相同的,唯一的區別是它們與不同的DB進行交互,但它是非常簡單的只讀操作與DB雖然。

任何想法?

回答

0

兩個重要的事情要檢查這種問題:

  1. 讀取服務器日誌的任何異常和蹤跡。在Tomcat中它位於/logs文件夾中。如果你找到了,那麼這些應該提供足夠的信息來解決你自己的問題。但是如果你不明白原因,那麼你需要更新你的問題以包含相關的異常和堆棧跟蹤。這樣我們可以幫助解釋原因,以便解決方案足夠明顯。

  2. 確保代碼不在任何地方吞嚥重要的異常。即你至少需要在捕捉後重新拋出或記錄它們。例如。因此

    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()任何異常可以忽略不計,但我更喜歡記錄它們,這樣你就不會丟失故障的任何證據的任何地方,即使它很小。

0

這可能是數據庫超時相關問題。也許你的數據庫有不同的超時時間?你使用connection pooling? (你應該!)這兩個連接的池設置是否相同?數據庫是否配置爲超時超過池超時值?你有沒有在連接參數中設置autoReconnect = true?

0

您是否檢查過服務器端日誌?如果你看日誌,你可能會得到一些線索。

1

問題在於Logger。 Logger實例在線程完成執行時並未隱式釋放,並且由於沒有明顯的方法(如close()關閉Logger實例,doGet/doPost線程無法正確退出。

擺脫記錄器,或者顯式銷燬實例/將其分配給null將解決問題。

0

我不認爲有人可以幫助您,直到您提供強制源代碼並描述您部署應用程序的方式。

相關問題