錯誤案例
public class ReleaseRes { public void releaseDB () { Connection conn = null; APLResultSet rs = null; String sql= ""; try { conn = DB.getConnection(); rs = DB.query(sql); if (rs.next()) { return rs.getString("currentdate"); } else { return DateTool.getCurrentDate(pattern); } Conn.close(); //錯誤1 } catch (DBException e) { ................... } //錯誤2 } public void releaseIO (File file) { StringBuffer sb = null; BufferedReader in = null; try { in = new BufferedReader(new FileReader(file)); sb = new StringBuffer(); for (String line; (line = in.readLine()) != null;) { sb.append(line + "\r\n"); } } catch (IOException ex) { Throw ex; } //錯誤3 }
錯誤分析
錯誤1:連接沒有在finally正確釋放,會出現異常時導致在運行一段時間後,系統由於連接池滿載而崩潰。錯誤2:資源APLResultSet沒有正確釋放錯誤3:IO資源沒有正確釋放,需要在finally中釋放資源
對任何的數據庫,IO等資源的操作完畢之後,都需要進行釋放,假如不釋放資源會被耗盡,導致系統崩潰。
正確用法
public class ReleaseRes { public void releaseDB () { Connection conn = null; ResultSet rs = null; String sql= ""; try { conn = DB.getConnection(); rs = DB.query(sql); if (rs.next()) { return rs.getString("currentdate"); } else { return DateTool.getCurrentDate(pattern); } } catch (DBException e) { ................... } finally { conn.close(); rs.close(); } } public void releaseIO (File file) { StringBuffer sb = null; BufferedReader in = null; try { in = new BufferedReader(new FileReader(file)); sb = new StringBuffer(); for (String line; (line = in.readLine()) != null;) { sb.append(line + "\r\n"); } } catch (IOException ex) { Throw ex; } finally { in.close(); } }