正确关闭JDBC连接对象

时间:2016-02-01 04:01:55

标签: java jdbc

据我所知,关闭finally块中的连接对象是最佳实践。但是,如果rs.close() / ps.close()在finally块中抛出异常,则不会执行conn.close()。因此,我曾经在两个位置(如提供的样本中)关闭连接,一次在使用后直接关闭,其次在最后一个块中使用check for null关闭连接。但有些人认为block 1是冗余代码。它是真的多余还是有正确的方法来解决这个问题而不在两个地方关闭连接?

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
    conn = dataSource.getConnection(); // geting the connection object
    ps = connection.prepareStatement(INSERT_QUERY);
    rs = ps.executeQuery();
    // some logic here ...
    // ---- block 1 ----
    ps.close()
    ps = null;
    rs.close();
    rs = null;
    conn.close();
    conn = null;
    // ---- end block 1 ----
} catch (SQLException e) {
    // exception handling ...
} finally {
    closeQuietly(conn, ps, rs);
}

private void closeQuietly(Connection connection, PreparedStatement ps, ResultSet rs) {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) {}
    }
    if (ps != null) {
        try {
            ps.close();
        } catch (SQLException e) {}
    }
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {}
    }
}

3 个答案:

答案 0 :(得分:4)

  

有没有正确的方法来解决这个问题,而无需在两个地方关闭连接?

是:

try (Connection conn = dataSource.getConnection(); // geting the connection object
    Prepared Statement ps = connection.prepareStatement(INSERT_QUERY);
    ResultSet rs = ps.executeQuery();) {
    // ...
}

这是'try-with-resources'语法。 <{1}}之后在()内宣布的所有内容都保证关闭。

答案 1 :(得分:0)

是的,如果你的代码一切正常,它会被调用两次。这就是原因,人们更喜欢在finally块中关闭任何类型的连接(jdbc,stream等)。 如您所知,无论程序是否正确执行,finally块都会被执行。 所以,我建议你不要在使用后关闭代码。

Jitendra

答案 2 :(得分:0)

块1确实是多余的,因为closeQuietly将始终由于finally块而运行。

closeQuietly做正确的事情: 由于每个资源都被自己的try-catch块包围,即使关闭语句或结果集的块抛出异常,清理连接的代码也会运行:这些异常将被try-catch块捕获并忽略。