查找未正确关闭的DB连接

时间:2013-04-09 19:35:50

标签: java sql database connection

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

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

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

3 个答案:

答案 0 :(得分:4)

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

特别是,PMD默认情况下可能会产生噪音,但可以使用custom rulesetother means来调整它。

答案 1 :(得分:0)

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

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

请参阅:Write a custom syntax interpreter in java?

答案 2 :(得分: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){
    }
}