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);        }    } 
Share the Post:
Share on facebook
Share on twitter
Share on linkedin

Overview

Recent Articles: