2

在数据库连接打开但未关闭的大型项目的代码中发现了一些泄漏。DB是DB2,连接是在java程序中打开的,并且在try catch中没有正确关闭,最后......

有没有办法在java中搜索所有打开连接但不关闭它的方法?我试图避免手动查看打开连接的每个方法以查看它是否正确关闭。

对这项繁琐任务的任何帮助都会很酷。

4

3 回答 3

4

FindBugsPMD(开源静态代码检查器)都支持检测未关闭的数据库连接。它们可以集成到您的构建过程和/或 IDE 中。

尤其是 PMD,默认情况下可能很嘈杂,但可以使用自定义规则集或通过其他方式对其进行调整。

于 2013-04-09T19:47:16.473 回答
0

我首先想到的是实现一个利用抽象语法树的工具(例如作为一个 Eclipse 插件)。您可以编写一个工具来检查您的方法,检查节点的连接初始化命令,并检查关闭命令。参见:- http://en.wikipedia.org/wiki/Abstract_syntax_tree参见:- http://www.eclipse.org/articles/Article-JavaCodeManipulation_AST/index.html

否则,我认为也可以使用某种自定义解析器来检查与等效的数据库打开语句在同一级别内是否存在等效的 .close() 语句。您必须检查您有多少级别(使用“{”和“}”字符。

请参阅:在 java 中编写自定义语法解释器?

于 2013-04-09T19:46:25.270 回答
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){
    }
}
于 2013-04-09T20:12:33.667 回答