2013-04-09 61 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