2012-09-05 46 views
0

該代碼是否影響性能或導致任何內存泄漏?這裏PreparedStatement對象沒有關閉並且沒有提及關閉。對此有何建議?準備聲明對象未關閉

private ResultSet getEmpData(String query){ 
    ResultSet rs = null; 
    try { 
     rs = connection.prepareStatement(query).executeQuery(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return rs; 
} 

public int getEmployeeSalary(){ 

    ResultSet rs = null; 
    int salary = 0 ; 
    try { 
     rs = getEmpData("SELECT SALARY FROM EMP WHERE NAME ='SAM'"); 
     while (rs.next()) { 
      salary = rs.getInt(1); 
     } 
    } catch (SQLException e) { 
    }finally{ 
     if (rs!= null) { 
      try { 
       rs.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return salary; 
} 

回答

0

當您關閉ResultSet時,您並未關閉與其關聯的PreparedStatement語句。你應該在你的finally塊做的是以下幾點:

rs.getStatement().close(); 

這將確保聯合聲明被關閉。另外,作爲每Javadoc

時生成它的Statement對象 被關閉時,重新執行,或用於檢索從多個結果的序列中的下一 結果一個結果對象被自動關閉。

這意味着當您使用上述代碼關閉語句對象時,您也有效地關閉了ResultSet對象。

0

從技術上講,你不應該關閉你的ResultSet,而應該關閉數據庫連接本身。如果您在完成數據庫操作後關閉數據庫連接,這應該不會導致內存泄漏。