Запрос об утечке соединения с классом Utility

У меня есть служебный класс JDBC, который содержит экземпляры Resultset, Statement и Connection в качестве глобальных ссылок. Этот класс имеет два основных метода, таких как «выполнить» (имеет некоторые параметры) и «закрыть» и внутри выполнить, вышеприведенные экземпляры создаются и назначаются и, наконец, возвращает созданный набор результатов.

И метод «закрыть» закрывает все открытые соединения для набора результатов, заявления и соединений просто так.

public void close() {

        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException sqlEx) {
                sqlEx.printStackTrace();
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException sqlEx) {
                sqlEx.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException sqlEx) {
                    sqlEx.printStackTrace();
            }
        }
    }

И в моем клиентском приложении я создаю экземпляр утилиты и получаю набор результатов, как показано ниже.

ResultSet rs = dbutil.execute(strQuery,values);

и если я закрою набор результатов с помощью rs.close и снова с помощью dbutil.close() в своем клиентском приложении,

  1. произойдет ли утечка соединения или утечка памяти?
  2. что произойдет, если я буду использовать только rs.close() в своем клиенте?
  3. Существуют ли какие-либо возможности для утечек соединения?

заранее спасибо


person user1727557    schedule 24.12.2013    source источник
comment
Я думаю, что API ResultSet.close проверяет, закрыт ли набор результатов или нет. Таким образом, не будет никаких проблем, если вы вызовете .close дважды (из вашего клиента, а затем из dbutil).   -  person Ankit    schedule 24.12.2013
comment
На самом деле это не техническая проблема, но это показатель того, что код обработки ошибок приложения не разработан должным образом.   -  person Gimby    schedule 24.12.2013
comment
@Gimby, что такое код обработки ошибок. Вы имеете в виду часть закрытия соединения?   -  person user1727557    schedule 24.12.2013


Ответы (2)


Объект ResultSet автоматически закрывается сгенерировавшим его объектом Statement, когда этот объект Statement закрывается, повторно выполняется или используется для извлечения следующего результата из последовательности нескольких результатов.

Вызов метода close для объекта ResultSet, который уже закрыт, недопустим. См. документацию по Java для набор результатов.

person hanish.kh    schedule 24.12.2013
comment
что произойдет, если я буду использовать только rs.close() - person user1727557; 24.12.2013
comment
Просто ваше заявление и соединение останутся открытыми. Не рекомендуется каждый раз открывать и закрывать соединение, потому что это тяжелая операция. Вместо этого используйте пул соединений. Если операторы остаются открытыми, это может привести к ложным ошибкам и неправильному поведению. - person hanish.kh; 24.12.2013

Вызов close() для объекта ResultSet, который уже был закрыт, не имеет никакого эффекта и не приводит к ошибке.

Если вы используете только rs.close(), вы утечете оператор и соединение, что в зависимости от того, как долго живет ваше приложение и создаете ли вы новые экземпляры вашего класса dbutil, может вызвать ошибку базы данных (для вашего приложения или для других, использующих ту же базу данных ) из-за достижения максимального количества открытых курсоров (из-за незакрытых операторов) или максимального количества соединений (из-за незакрытых соединений).

Если вы используете Java 7, вам также следует подумать о том, чтобы ваш класс dbutil реализовал интерфейс java.lang.AutoCloseable. Это позволяет вам использовать шаблон «попробовать с ресурсами», если вы объявили свой экземпляр dbutil как локальную переменную. Однако открытие соединений с базой данных происходит относительно медленно, поэтому вам следует избегать многократного закрытия и повторного открытия их в вашем приложении, если только вы не используете пул соединений.

person azordi    schedule 24.12.2013