2013-04-09 2 views
2

Были обнаружены некоторые утечки в коде большого проекта, где соединения DB открыты, но не закрыты. DB - это DB2, и соединения открываются в программе java и не закрыты должным образом в попытке catch, наконец.Поиск соединений DB, которые не закрыты должным образом

Есть ли способ поиска в java для всех методов, которые открывают соединение, но не закрывают Это? Я пытаюсь избежать ручного просмотра каждого метода, который открывает соединение, чтобы проверить, правильно ли оно закрыто.

любая помощь с этой утомительной задачей была бы крутой.

ответ

4

Оба FindBugs и PMD (с открытым исходным кодом статического кода шашек) Поддержка обнаружения незамкнутую 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

+0

Хе-хе, это правда: P – CronbachAlpha

Смежные вопросы