1

即使在 Java 7 中,我也经常看到这样的代码

    Connection c = null;
    PreparedStatement s = null;
    try {
        c = dataSource.getConnection();

        String sql = "insert into table (column1, column2) values (?, ?);
        s = c.prepareStatement(sql);
        int i = 1;
        s.setString(i++, "111");
        s.setString(i++, "222");

        s.execute();

    } catch (SQLException e) {
        log.error("failed to insert", e);
    } finally {
        DbUtils.close(s, c); // closes s and c with no questions
    }

但是根据规范,当连接关闭时,所有语句和结果集都会被释放。

我听说 JDBC 驱动程序有可能不遵守 JDBC API 的规则,旧的方式更好。我的问题是听听对此的看法。代码看起来更好,但如果它很危险怎么办?在我看来,最喜欢的方法是在这里使用try-with-resources。它足够安全吗?

4

4 回答 4

1

资源是程序完成后必须关闭的对象。因此您不必在finally块中手动关闭对象

 String sql = "insert into table (column1, column2) values (?, ?);
    try(Connection  c = dataSource.getConnection();
    PreparedStatement s = c.prepareStatement(sql);) {


        int i = 1;
        s.setString(i++, "111");
        s.setString(i++, "222");

        s.execute();

    } catch (SQLException e) {
        log.error("Failed to insert transaction", e);
    } 
于 2014-04-17T16:15:21.777 回答
0

您应该始终释放/关闭您使用的资源,例如 ResultSet、Statement、Connection。这应该在 finally 块中完成。您在此处粘贴的代码段看起来不错(只要 s 和 c 在 QuietDb 中关闭)。

于 2014-04-17T16:11:44.810 回答
0

虽然关闭 a将关闭与其关联的Connection所有StatementStatements ,但在大多数数据库中,您可以同时为任何一个 s 打开多少个 s 是有上限的Connection

如果您不关闭Statements,则会增加错误的可能性,例如ORA-01000: maximum open cursors exceeded.

如果你 close Statements他们也会关闭他们ResultSet的 s,所以你不必同时关闭两者。

于 2014-04-17T18:34:01.723 回答
0

使用try-with-resources您的代码可以重写为:

try (
    Connection c = dataSource.getConnection();
    PreparedStatement s = c.prepareStatement("insert into table (column1, column2) values (?, ?)");
) {
    int i = 1;
    s.setString(i++, "111");
    s.setString(i++, "222");

    s.execute();
} catch (SQLException e) {
    log.error("failed to insert", e);
}

这保证了语句和连接都被关闭(即使关闭语句会引发异常!)。唯一的区别可能是现在可能会抛出关闭异常,因为我不知道您是否会DbUtils.close吞下异常。

一般来说,try-with-resources 提供了更简洁的代码,并且更能确保资源以正确的顺序正确关闭,而无需太多样板。

于 2014-04-18T09:28:40.587 回答