Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: Java
Expertise: Intermediate
Jul 27, 2004

Closing JDBC Objects Explicitly Can Save You Headaches!

Most Java programmers close a connection with the database directly—without closing the ResultSet or Statement.

For example, take a look at the following code snippet:


    try
    {
        Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
        Connection conn = DriverManager.getConnection("jdbc:odbc:issue","x","x");
        Statement stmt = conn.createStatement();
        ResultSet rs   = stmt.executeQuery( "SELECT * FROM TABLE" );
    }
    catch( SQLException e )
    {
        logger.error("Some error happened", e);
    } 
This code looks perfectly fine. But not all JDBC drivers clean themselves up. To be safe, remember to close the everything explicitly in reverse order. Most people do it as shown below:

    Connection conn = null;
    ResultSet rs = null;
    Statement stmt = null;
    try
    {
        Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
        conn = DriverManager.getConnection("jdbc:odbc:issue","x","x");
        stmt = conn.createStatement();
        rs   = stmt.executeQuery( "SELECT * FROM TABLE" );
    }
    catch( SQLException e )
    {
        logger.error("Some error happened", e);
    } 
    finally
    {
        try
        {
            if (rs  != null)
                rs.close();
            if (stmt  != null)
                stmt.close();
            if (conn  != null)
                conn.close();
        }
        catch (SQLException e)
        {
            // ignore
        }
    }
If an exception is thrown during the close of the ResultSet, the Statement and Connection are never closed. In addition, most coders ignore the SQLException. What if an error occurs and you want to find out about it? It's probably a good idea to log it so that you have a record of the actual error.
 
    Connection conn = null;
    ResultSet rs = null;
    Statement stmt = null;
    try
    {
        Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
        Connection conn = DriverManager.getConnection("jdbc:odbc:issue","x","x");
        Statement stmt = conn.createStatement();
        ResultSet rs   = stmt.executeQuery( "SELECT * FROM TABLE" );
    }
    catch (SQLException e)
    {
         logger.error(e.getMessage(), e);
    }
    finally
    {
        try
        {
            if (rs != null)
                rs.close();
        }
        catch (Exception e)
        {
            // it's a good idea to log it!
            logger.error("Cannot close ResultSet", e);
        }
        try
        {
            if (stmt != null)
                stmt.close();
        }
        catch (Exception e)
        {
            // it's a good idea to log it!
            logger.error("Cannot close Statement", e);
        }
        try
        {
            if (conn  != null)
                conn.close();
        }
        catch (SQLException e)
        {
            // it's a good idea to log it!
            logger.error("Cannot close Connection", e);
        }
    } 
Keith Naas
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap