2

Java で 1 つの SQL ステートメントを実行するには、多くの手順が必要です。

  1. 接続を作成
  2. ステートメントを作成
  3. ステートメントの実行、結果セットの作成
  4. 結果セットを閉じる
  5. ステートメントを閉じる
  6. 接続を閉じる

これらの各ステップで、SQLException がスローされる可能性があります。すべての例外を処理し、すべてのリソースを正しく解放すると、コードは次のようになり、4 レベルの TRY が積み重なって表示されます。

try {
     Connection connection = dataSource.getConnection();
     try {
           PreparedStatement statement = connection.prepareStatement("SELECT 1 FROM myTable");
           try {
                ResultSet result = statement.executeQuery();
                try {
                     if (result.next()) {
                           Integer theOne = result.getInt(1);
                     }
                }
                finally {
                     result.close();
                }
           }
           finally {
                statement.close();
           }
     }
     finally {
           connection.close();
     }
}
catch (SQLException e) {
// Handle exception
}

消費されたすべてのリソースを解放しながら、ステートメントを実行するためのより良い (より短い) 方法を提案できますか?

4

6 に答える 6

8

Java 7を使用している場合、try with resourcesステートメントはこれをかなり短縮し、保守しやすくします。

try (Connection conn = ds.getConnection(); PreparedStatement ps = conn.prepareStatement(queryString); ResultSet rs = ps.execute()) {

} catch (SQLException e) {
    //Log the error somehow
}

接続を閉じるStatementsと、関連付けられているすべてのとが閉じることに注意してくださいResultSets

于 2012-12-05T14:40:25.143 に答える
4

Apache Commons DbUtils、特にcloseQuietly()メソッドを確認してください。1つ以上がnullの場合を含め、接続/ステートメント/結果セットのクローズを正しく処理します。

別の方法はSpringJdbcTemplateです。これは、多くの作業を抽象化し、データベースクエリをはるかに機能的な方法で処理します。のすべての行に対して呼び出されるコールバックとしてクラスを提供するだけですResultSet。反復、例外処理、およびリソースの正しいクローズを処理します。

于 2012-12-05T14:40:13.487 に答える
0

呼び出すことができる静的メソッドを使用してユーティリティクラスを作成します。

package persistence;

// add imports.

public final class DatabaseUtils {

    // similar for the others Connection and Statement
    public static void close(ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (Exception e) {
            LOGGER.error("Failed to close ResultSet", e);
        }
    }
}

したがって、コードは次のようになります。

     Integer theOne = null;
     Connection connection = null;
     PreparedStatement statment = null;
     ResultSet result = null;
     try {
         connection = dataSource.getConnection();
         statement = connection.prepareStatement("SELECT 1 FROM myTable");
         result = statement.executeQuery();
         while (result.next()) {
             theOne = result.getInt(1);
         }
    } catch (SQLException e) {
        // do something
    } finally {
        DatabaseUtils.close(result);
        DatabaseUtils.close(statement);
        DatabaseUtils.close(connection);
    }
    return theOne;

このメソッドの外部で接続をインスタンス化して渡すことをお勧めします。この方法でトランザクションをより適切に処理できます。

于 2012-12-05T14:39:43.377 に答える
0

を閉じるだけでConnection、すべてのリソースが解放されます*。Statementを閉じる必要はありませんResultSet

*アクティブなトランザクションがないことを確認してください。

于 2012-12-05T14:43:36.900 に答える
0
Connection connection = null;
PreparedStatement statement = null;
ResultSet result = null;
try {
     connection = dataSource.getConnection(); 
     statement = connection.prepareStatement("SELECT 1 FROM myTable");
     result = statement.executeQuery();
     if (result.next()) {
         Integer theOne = result.getInt(1);
     }
}
catch (SQLException e) { /* log error */ }
finally {           
     if (result != null) try { result.close(); } catch (Exception e) {/*log error or ignore*/}
     if (statement != null) try { statement.close(); } catch (Exception e) {/*log error or ignore*/}
     if (connection != null) try { connection.close(); } catch (Exception e) {/*log error or ignore*/}
}
于 2012-12-05T14:48:34.080 に答える
0

あなたのコードは、このように短縮して書くことができます...

Connection connection = dataSource.getConnection();
PreparedStatement statement = null;
ResultSet result = null;
try {
    statement= connection.prepareStatement("SELECT 1 FROM myTable");
    result = statement.executeQuery();
    if (result.next()) {
        Integer theOne = result.getInt(1);
    }
} catch (SQLException e) {
    // Handle exception

} finally {
    if(result != null) result.close();
    if(statement != null) statement.close();
    if(connection != null) connection.close();
}
于 2012-12-05T14:48:58.480 に答える