代码bug记录之JDBC关闭

手动关闭JDBC涉及资源的方法:


    /**
     * @param rs    ResultSet
     * @param pstmt Statement
     * @param conn  Connection
     * @description 关闭数据库连接
     **/
    public static void close(ResultSet rs, Statement pstmt, Connection conn) {
        //关闭数据库的资源的顺序最好与使用的顺序相反
        //数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放
        //都要加try catch 以防前面关闭出错,后面的就不执行了
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

上述关闭JDBC资源的顺序无误,关闭资源的顺序是正确的,并且使用了适当的异常处理。然而,可以进一步改进方法的实现以确保资源能够始终被关闭。

  1. 避免隐藏异常:在当前实现中,如果关闭资源时出现异常,它们将被捕获并打印堆栈跟踪信息,但程序会继续执行其他关闭操作。这可能会导致后续的close操作无法执行,影响到资源的释放。为了避免此问题,建议在每个资源的try-catch块内部捕获异常,并在所有资源关闭完成后再重新抛出异常或进行必要的处理。

  2. 空指针异常处理:在原始代码中,在调用close方法时,传入的连接、语句和结果集有可能为空(比如在查询执行之前就发生了异常)。为了避免空指针异常,可以在方法开头添加对参数的非空判断,只有在非空情况下才执行关闭操作。

改进后的方法:

public static void close(ResultSet rs, Statement pstmt, Connection conn) {
    try {
        if (rs != null && !rs.isClosed()) {
            rs.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }

    try {
        if (pstmt != null && !pstmt.isClosed()) {
            pstmt.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }

    try {
        if (conn != null && !conn.isClosed()) {
            conn.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

强烈建议:为了确保资源能够正确关闭,可以将每个资源的关闭过程放在单独的try-catch块中,并在每个块内部进行相应的异常处理和资源释放。

 try (Connection conn = DriverManager.getConnection(url, properties);
      Statement statement = conn.createStatement();
      ResultSet rs = statement.executeQuery(sqlStr)) {...}
 catch (Exception e) {...}

你可能感兴趣的:(java,bug,数据库,java)