What happens with the Statement when ResultSet is

2019-06-02 15:04发布

问题:

What happens with the statement when result set is closed?

    Statement stmt = null;
    ResultSet rs = null;

    try {
        stmt = con.createStatement();
        rs = stmt.executeQuery(query.toString());
        ...
    }

    // lots of code

    rs.close()

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.

But what happens when ResultSet is closed first?

For what matter, what should happen first?

回答1:

You should close the objects in the reverse order of creating them. So first, the ResultSet, then the Statement and in the end, Connection.

If you don't close the Statement it stays open and you can execute another query with it (if it's a PreparedStatement or CallableStatement you are able to change query parameters).

Also note, that what you quoted is a JDBC specification, and the implementation of it is up to a JDBC driver provider. Usually, you should not trust them, and manually close those objects.

The other thing - I think more important - if you are using connection pools (like on JBoss), closing connection just releases it back to the pool, and the underlying objects are not released. And because of this, its recommended to always manually release all the objects you created.



回答2:

The Statement actually can be reused. Though if you're repeating the same query, you should use a PreparedStatement instead as the query will be compiled once.

They of course should be closed when you're done with them, but closing the ResultSet doesn't automatically close the Statement for good reason.



回答3:

Nothing happens to the Statement -- it stays open. You can continue to use the Statement however you'd like, but be sure to close it when you're finished.



标签: java jdbc