Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确关闭JDBC连接对象_Java_Jdbc - Fatal编程技术网

Java 正确关闭JDBC连接对象

Java 正确关闭JDBC连接对象,java,jdbc,Java,Jdbc,据我所知,在finally块中关闭连接对象是最佳实践。但是,如果rs.close()/ps.close()在finally块抛出异常,它将不会执行conn.close()。因此,我习惯于在两个位置关闭连接(如示例所示),一次是在使用后直接关闭,另一次是在finally块中使用null检查。但有些人认为块1 作为冗余代码。它是否真的是多余的,或者是否有适当的方法在不关闭两个地方的连接的情况下解决此问题 Connection conn = null; PreparedStatement ps = n

据我所知,在finally块中关闭连接对象是最佳实践。但是,如果
rs.close()
/
ps.close()
在finally块抛出异常,它将不会执行
conn.close()
。因此,我习惯于在两个位置关闭连接(如示例所示),一次是在使用后直接关闭,另一次是在finally块中使用null检查。但有些人认为<代码>块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) {}
    }
}

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



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



Jitendra

块1确实是冗余的,因为closequiety将始终由于finally块而运行

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

块1确实是冗余的,因为closequity总是由于finally块而运行

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

在不关闭两个地方的连接的情况下,是否有适当的方法解决此问题

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) {}
    }
}
是的:

这是“尝试使用资源”语法。在
try
之后
()
中声明的所有内容都保证关闭

在不关闭两个地方的连接的情况下,是否有适当的方法解决此问题

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) {}
    }
}
是的:

这是“尝试使用资源”语法。在
try
之后
()
中声明的所有内容都保证关闭