Практическое предложение состоит в том, чтобы добавить некоторый отладочный код и создание «журнала» и закрыть наборы результатов в CSV-файл.Позже вы можете проверить этот файл и проверить, есть ли запись «close» для каждого «create».
Итак, если у вас есть служебный класс со статическими методами, который позволяет записывать строки в файл, вы можетесделайте это следующим образом:
ResultSet rs = stmt.executeQuery(query);
Util.writeln(rs.hashcode() + ";create"); // add this line whenever a
// new ResultSet is created
и
rs.close();
Util.writeln(rs.hashcode() + ";closed"); // add this line whenever a
// ResultSet is closed
Откройте файл CSV в Excel или любой другой программе для работы с электронными таблицами, отсортируйте таблицу и посмотрите, не закрыты ли наборы результатов.Если это так, добавьте больше отладочной информации, чтобы четко идентифицировать открытые наборы.
Кстати: перенос интерфейсов (например, JAMon) довольно прост, если у вас есть затмение или что-то еще, его кодирование вменее 15 минут.Вам нужно будет обернуть Connection, Statement (и PreparedStatement?) И ResultSet, обертку ResultSet можно было бы оборудовать для отслеживания и мониторинга создания и закрытия наборов результатов:
public MonitoredConnection implements Connection {
Connection wrappedConnection = null;
public MonitoredConnection(Connection wrappedConnection) {
this.wrappedConnection = wrappedConnection;
}
// ... implement interface methods and delegate to the wrappedConnection
@Override
public Statement createStatement() {
// we need MonitoredStatements because later we want MonitoredResultSets
return new MonitoredStatement(wrappedConnection.createStatemet());
}
// ...
}
То же самое для MonitoredStatement и MonitoredResultSetMonitoredStatement вернет упакованные ResultSets):
public MonitoredStatement implements Statement {
private Statement wrappedStatement = null;
@Override
public ResultSet executeQuery(String sql) throws SQLException
MonitoredResultSet rs = wrappedStatement.executeQuery(sql);
ResultSetMonitor.create(rs.getWrappedResultSet()); // some static utility class/method
return rs;
}
// ...
}
и
public MonitoredResultSet implements ResultSet {
private ResultSet wrappedResultSet;
@Override
public void close() {
wrappedResultSet.close();
ResultSetMonitor.close(wrappedResultSet); // some static utility class/method
}
// ...
}
В конце вам нужно всего лишь изменить одну строку в вашем коде:
Connection con = DriverManager.getConnection(ur);
до
Connection con = new MonitoredConnection(DriverManager.getConnection(ur));