2013-08-19 63 views
-1


最近我在看tomcat服務器的頻繁掛起,並且遇到了一些部分代碼中頻繁拋出的異常。
引發異常並從最終返回 - Tomcat掛起

當我檢查了代碼,這是什麼樣子

public static String doSomething() { 
    String returnVakue = "default value"; 

    try { 
     ResultSet rs = getMyResultSet(); 

     rs.first(); 
     returnValue = rs.getString("my_field"); // Note that Exception happens at times when the ResultSet is empty 

    } catch (Exception e) { 
     throw new Exception(e); 
    } finally { 
     return returnValue; 
    } 

} 

雖然我知道,這是完全可以擁有兩個拋出異常和返回,不知道這會造成什麼樣的泄漏在tomcat。性能是否存在潛在風險? ?不過,我的呼叫者函數在這一點上停止執行。對此有何看法?它會影響GC嗎?

編輯:注意:我知道如何更正此代碼。請分享您的觀點是否可能導致tomcat掛起。

+0

其他信息:Tomcat啓動時表現緩慢這種情況下 – Akhil

+0

的多個實例後,「雖然我知道,這是完全可以擁有兩個拋出異常,退」 - 這是沒有意義的。如果拋出異常,調用方法永遠不會看到它,因爲它將進入異常處理模式,並且不會使用返回的值。強烈建議您從該代碼中移除finally塊並查看您的問題是否消失。 – StormeHawke

+0

感謝您的評論。但我的意思是,Syntactically Java支持。我非常清楚,這是無意義的編程。我會糾正它。但是我的問題是,這是否會導致tomcat在一段時間後掛起。 – Akhil

回答

0

首先檢查返回的ResultSet是否爲空。

while(rs.next()) { 
    // ResultSet processing here 
    // Result set is not empty 
} 

在我看來,拋出異常是你的決定,但最後你應該清理乾淨,關閉連接。

如果未關閉,則打開連接會導致tomcat掛起,因爲到服務器的新請求將等待連接變爲可用。

Java引用的任何對象都不是garabage收集的,在你的情況下,如果Connections沒有關閉,那麼這些對象將不會被垃圾收集。

乾杯!

0

如果查詢需要很長時間,而不是JDBC的問題。數據庫負責。當然,如果JDBC使用得當的話。另一方面,如果您使用簡單的JDBC,最好在應用程序中添加一個圖層DAO。

public class UserDAO extends DAO { 

    private static final String FIND_BY_PK_SQL = 
     "SELECT mail, password " + 
     " FROM user WHERE mail = ?"; 

    public User findByPk(final String mail) throws DAOException { 
     Connection conn = null; 
     PreparedStatement ps = null; 
     ResultSet rs = null; 
     try { 
      conn = getConnection(); 
      ps = conn.prepareStatement(FIND_BY_PK_SQL); 
      ps.setString(1, mail); 
      rs = ps.executeQuery(); 
      if (rs.next()) { 
       return fill(rs); 
      } 
      return null; 
     } catch (final SQLException e) { 
      throw new DAOException(e); 
     } finally { 
      DbUtils.closeQuietly(conn, ps, rs); 
     } 
    } 

    private User fill(final ResultSet rs) throws SQLException { 
     final User user = new User(); 
     user.setMail(rs.getString("mail")); 
     user.setPassword(rs.getString("password")); 
     return user; 
    } 
}