2013-04-09 60 views
2

在打開數據庫連接但尚未關閉的大型項目的代碼中發現了一些泄漏。 該數據庫是DB2和連接打開一個Java程序,並沒有正確關閉在try catch,最後..查找未正確關閉的數據庫連接

有什麼辦法在java中搜索所有打開連接但沒有關閉的方法它? 我試圖避免手動查看每個打開連接的方法,以查看它是否正確關閉。

任何幫助這個單調乏味的任務都會很酷。

回答

4

兩個FindBugsPMD(開源靜態代碼檢查器)支持檢測未封閉的DB連接,也可以集成到您的構建過程和/或IDE。

PMD,尤其是,可以通過默認嘈雜,但它可以使用custom ruleset或通過other means被調低。

0

我想到的第一件事就是實現一個利用抽象語法樹(例如eclipse插件)的工具。你可以寫一個貫穿你的方法的工具,檢查節點的連接初始化命令,並檢查關閉命令。 請參閱: - http://en.wikipedia.org/wiki/Abstract_syntax_tree見: - http://www.eclipse.org/articles/Article-JavaCodeManipulation_AST/index.html

否則,我認爲也有一些樣定製解析器可以使用的檢查有相同的水平相當於打開數據庫語句中的等價.close()語句。 你會檢查你的(利用多少級在「{」和「}」字符

參見:Write a custom syntax interpreter in java?

0

關於對於你的問題,你也可以通過確保關閉連接的方法來實現一個類。在我發佈了一個例子。

public class Cleaner { 

private String dbName = ""; 
private Connection connection; 

public static void CloseResSet(ResultSet res) { 
    try { 
     if (res != null) { 
      res.close(); 
     } 
    } catch (SQLException e) { 
     writeMessage(e, "CloseResSet()"); 
    } 
} 

public static void closeStatement(Statement stm) { 
    try { 
     if (stm != null) { 
      stm.close(); 
     } 
    } catch (SQLException e) { 
     writeMessage(e, "closeStatement()"); 
    } 
} 

public static void closeConnection(Connection connection) { 
    try { 
     if (connection != null) { 
      connection.close(); 
     } 
    } catch (SQLException e) { 
     writeMessage(e, "closeConnection()"); 
    } 
} 

public static void rollBack(Connection connection) { 
    try { 
     if (connection != null && !connection.getAutoCommit()) { 
      connection.rollback(); 
     } 
    } catch (SQLException e) { 
     writeMessage(e, "rollBack()"); 
    } 
} 

public static void setAutoCommit(Connection connection) { 
    try { 
     if (connection != null && !connection.getAutoCommit()) { 
      connection.setAutoCommit(true); 
     } 
    } catch (SQLException e) { 
     writeMessage(e, "setAutoCommit()"); 
    } 
} 

public static void writeMessage(Exception e, String message) { 
    System.err.println("*** Error: " + message + ". ***"); 
    e.printStackTrace(System.err); 
} 

private void OpenConnection() { 
    try { 
     connection = DriverManager.getConnection(dbName); 
     System.out.println("Databaseconnection established"); 
    } catch (SQLException e) { 
     Cleaner.writeMessage(e, "Constructor"); 
     Cleaner.closeConnection(connection); 
    } 
} 

private void closeConnection() { 
    System.out.println("Closes databaseconnection"); 
    Cleaner.closeConnection(connection); 
} 
public static void main(String[] args){ 
    } 
} 
+0

謝謝! 我們有這樣的一個班級,但沒有人使用,如果沒有人叫方法:s – OakvilleWork 2013-04-09 20:39:30

+0

嘿嘿,那是真的:P – CronbachAlpha 2013-04-09 21:03:04