在数据库连接打开但未关闭的大型项目的代码中发现了一些泄漏。DB是DB2,连接是在java程序中打开的,并且在try catch中没有正确关闭,最后......
有没有办法在java中搜索所有打开连接但不关闭它的方法?我试图避免手动查看打开连接的每个方法以查看它是否正确关闭。
对这项繁琐任务的任何帮助都会很酷。
在数据库连接打开但未关闭的大型项目的代码中发现了一些泄漏。DB是DB2,连接是在java程序中打开的,并且在try catch中没有正确关闭,最后......
有没有办法在java中搜索所有打开连接但不关闭它的方法?我试图避免手动查看打开连接的每个方法以查看它是否正确关闭。
对这项繁琐任务的任何帮助都会很酷。
我首先想到的是实现一个利用抽象语法树的工具(例如作为一个 Eclipse 插件)。您可以编写一个工具来检查您的方法,检查节点的连接初始化命令,并检查关闭命令。参见:- http://en.wikipedia.org/wiki/Abstract_syntax_tree参见:- http://www.eclipse.org/articles/Article-JavaCodeManipulation_AST/index.html
否则,我认为也可以使用某种自定义解析器来检查与等效的数据库打开语句在同一级别内是否存在等效的 .close() 语句。您必须检查您有多少级别(使用“{”和“}”字符。
关于您的问题,您还可以使用确保您关闭连接的方法来实现一个类。在我发布了一个例子。
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){
}
}