即使在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。它足够安全吗?

最佳答案

资源是必须在程序完成后关闭的对象。因此,不必在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);
    }

10-08 17:06