I am getting a little confused, I was reading the below from http://en.wikipedia.org/wiki/Java_Database_Connectivity
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword" );
Statement stmt = conn.createStatement();
try {
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
//It's important to close the statement when you are done with it
stmt.close();
}
Do you not need to close the conn Connection? What is really happening if the conn.close() doesn't occur?
I have a private web app I'm maintaining that doesn't currently close either form, but is the important one really the stmt one, the conn one, or both?
The site keeps going down intermittently but the server keeps saying it's a database connection issue, my suspicion is that it's not being closed, but I don't know which if any to close.
Actually, it is best if you use a try-with-resources block and Java will close all of the connections for you when you exit the try block.
You should do this with any object that implements AutoClosable.
The call to getDatabaseConnection is just made up. Replace it with a call that gets you a JDBC SQL connection or a connection from a pool.
When you are done with using your
Connection
, you need to explicitly close it by calling itsclose()
method in order to release any other database resources (cursors, handles, etc) the connection may be holding on to.Actually, the safe pattern in Java is to close your
ResultSet
,Statement
, andConnection
(in that order) in afinally
block when you are done with them, something like that:The
finally
block can be slightly improved into (to avoid the null check):But, still, this is extremely verbose so you generally end up using an helper class to close the objects in null-safe helper methods and the
finally
block becomes something like that:And, actually, the Apache Commons DbUtils has a
DbUtils
class which is precisely doing that so there is no need to write your own.It is enough to close just
Statement
andConnection
. There is no need to explicitly close theResultSet
object.Java documentation says about
java.sql.ResultSet
:Thanks BalusC for comments: "I wouldn't rely on that. Some JDBC drivers fail on that."
Yes, you need to close the Connection. Otherwise, the database client will typically keep the socket connection and other resources open.
Yes. You need to close the resultset, the statement and the connection. If the connection has come from a pool, closing it actually sends it back to the pool for reuse.
You typically have to do this in a
finally{}
block, such that if an exception is thrown, you still get the chance to close this.Many frameworks will look after this resource allocation/deallocation issue for you. e.g. Spring's JdbcTemplate. Apache DbUtils has methods to look after closing the resultset/statement/connection whether null or not (and catching exceptions upon closing), which may also help.
It is always better to close the database/resource objects after usage. Better to close connection, resultset and statement objects in the
finally
block.Until Java7, all these resources needs to be closed using a
finally
block. If you are using Java 7, then for closing the resources you can do as follows.Now, con, stmt and rs objects become part of try block and java automatically closes these resources after use.
Hope I was helpful.