在大型项目的代码中发现了一些泄漏,其中数据库连接已打开但尚未关闭。 数据库是DB2,连接是在java程序中打开的,而不是在try catch中正确关闭,最后是..
有没有办法在java中搜索所有打开连接但不关闭它的方法? 我试图避免手动查看打开连接的每个方法,看它是否正确关闭。
任何有关这项繁琐任务的帮助都会很酷。
答案 0 :(得分:4)
FindBugs和PMD(开源静态代码检查程序)都支持检测未关闭的数据库连接。它们可以集成到您的构建过程和/或IDE中。
特别是,PMD默认情况下可能会产生噪音,但可以使用custom ruleset或other means来调整它。答案 1 :(得分:0)
我想到的第一件事就是实现一个利用抽象语法树的工具(例如作为eclipse插件)。您可以编写一个遍历方法的工具,检查节点的连接初始化命令,还检查关闭命令。 看到: - http://en.wikipedia.org/wiki/Abstract_syntax_tree见: - http://www.eclipse.org/articles/Article-JavaCodeManipulation_AST/index.html
否则,我认为也可以使用某种自定义解析器来检查在等效数据库open语句的同一级别中是否存在等效的.close()语句。 你必须检查你的等级数(使用“{”和“}”字符。
答案 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){
}
}