Когда ResultSet закрыт? - PullRequest
       4

Когда ResultSet закрыт?

1 голос
/ 13 февраля 2011

Я хочу знать, можно ли закрыть ResultSet, если я его не закрывал?У меня ResultSet - закрытое исключение, но я уверен, что я нигде не закрывал ResultSet.Что я делаю, так это то, что я использую ResultSet для выполнения запроса SELECT, затем я использую тот же ResultSet, потому что он вызывается этим методом:

public Object getValueAt( int row, int column )
        throws IllegalStateException {
    // ensure database connection is available
    if ( !dbConnection.isConnectedToDatabase() )
        throw new IllegalStateException( "Not Connected to Database" );

    // obtain a value at specified ResultSet row and column

    try {
        getResultSet().absolute( row + 1 );
        return getResultSet().getObject( column + 1 );
    } // end try
    catch ( SQLException sqlException ) {
        System.out.println("Exception from here dude");
        sqlException.printStackTrace();
    } // end catch

    return ""; // if problems, return empty string object
} // end method getValueAt

Итак, еще один вопрос: есть ли способ обеспечить ResultSetоткрыт?

Третий вопрос: Может быть, проблема в том, что я никогда не закрываю ResultSets.

Какой смысл закрывать ResultSet?

Редактировать: Вот так создается оператор внутри конструктора класса DBConnection:

Class.forName(driver);
        // connect to database
        connection = DriverManager.getConnection(url, username, password);

        // create Statement to query database
        statement = connection.createStatement(
     ResultSet.TYPE_SCROLL_INSENSITIVE,
     ResultSet.CONCUR_READ_ONLY );

        //connection ok
        connectedToDatabase=true;

ResultSet создается позже всякий раз, когда я хочу выполнить инструкцию.

Ответы [ 3 ]

7 голосов
/ 13 февраля 2011

Непосредственно из документов на ResultSet.close () :

Освобождает базу данных объекта ResultSet и ресурсы JDBC немедленно, вместо того, чтобы ждать, пока это не произойдет, когда он будет автоматически закрыт.

...

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

Итак, если вы закрыли инструкцию, сгенерировавшую ваш ResultSet, то вы получите это исключение.

Ответ на другой вопрос: вы не должны читатьрезультаты из ResultSet, как это.Выполните выбор чтения всех данных, которые вам нужны, из ResultSet за один раз, закройте соединение, а затем вы сможете читать выбранные данные столько, сколько хотите.У вас действительно не должно быть внешнего ресурса / класса, вызывающего ваш метод getValueAt, который, как вы ожидаете, все еще будет подключен к базе данных.Соединение может быть прервано по многим другим причинам, так что это не тот путь.

Третий ответ: ответ выше.

Последний ответ: явное освобождение ресурсов, не дожидаясь его закрытия, когдаЗаявление.

0 голосов
/ 13 февраля 2011

Я всегда закрываю Connections, ResultSets и Statement в блоке finally {}. В таком случае у меня нет этой проблемы, так как этот блок всегда выполняется (ну, не всегда, но здесь он подходит). Пожалуйста, обратитесь к этой записи , я разместил скелетную реализацию, которая может быть вам интересна.

0 голосов
/ 13 февраля 2011

Если вы закрыли одно из следующих действий, ваш ResultSet будет закрыт автоматически:

  1. Объект выписки.
  2. Объект соединения.

Я сильно подозреваю, что соединение закрывается.Это естественная тенденция закрывать соединение с базой данных после выполнения запроса.Хотя это хорошая практика, но, возможно, вы закрываете соединение даже до того, как используете объект ResultSet внутри класса TableModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...