devxlogo

Closing JDBC Objects Explicitly Can Save You Headaches!

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);        }    } 
See also  Professionalism Starts in Your Inbox: Keys to Presenting Your Best Self in Email
devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist