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

0

ResultSet、Statement、Connection など、使用するリソースは常に解放/クローズする必要があります。これは、finally ブロックで行う必要があります。ここに貼り付けたスニペットは問題ないように見えます (s と c が QuietDb で閉じられている限り)。

于 2014-04-17T16:11:44.810 に答える
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 に答える