Ahmed
Ahmed

Reputation: 3458

When is ResultSet closed?

I want to know if ResultSet can be closed if I didn't close it ? I have a ResultSet is closed exception but I am sure I didn't close the ResultSet anywhere . What I do exactly is that I use the ResultSet to perform a SELECT query then I use the same ResultSet because it's called by this method :

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

So , another question : Is there a way to ensure the ResultSet is opened ?

Third question : Maybe the problem because I never close ResultSets .

What's the point of closing ResultSet ?

Edit : That's how statement is being created inside the constructor of a class called 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 is created later whenever I want to execute a statement.

Upvotes: 2

Views: 20892

Answers (3)

Sebastian Łaskawiec
Sebastian Łaskawiec

Reputation: 2737

I always close Connections, ResultSets and Statements in finally {} block. In such case I don't have this problem, since this block is always executed (Well, not always, but here it fits). Please refer to this post, I placed skeleton implementation that might be interesting for you.

Upvotes: -1

Swaranga Sarma
Swaranga Sarma

Reputation: 13413

In case you have closed any of the following, your ResultSet will be closed automatically:

  1. Statement object.
  2. Connection object.

I am strongly suspecting the connection is being closed. It is a natural tendency to close the database connection once the query is run. While it is a good practice, but may be you are closing the connection even before you have used the ResultSet object inside your TableModel class.

Upvotes: -1

mdrg
mdrg

Reputation: 3402

Directly from the docs on ResultSet.close():

Releases this ResultSet object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed.

...

Note: A ResultSet object is automatically closed by the Statement object that generated it when that Statement object is closed, re-executed, or is used to retrieve the next result from a sequence of multiple results.

So, if you closed the Statement that generated your ResultSet is closed, you get that exception.

Another question's answer: you shouldn't read results from a ResultSet like that. Perform the select an read all the data you need from the ResultSet at once, close the connection and then later you can read the fetched data as much as you want. You really shouldn't have an external resource/class calling your getValueAt method, which you expect to still be connected to the database. Connection may be terminated for many other reasons, so that's not the way to go.

Third answer: answered above.

Last answer: releasing resources explicitly, without waiting for it to be closed when Statement is.

Upvotes: 9

Related Questions