web-dev-qa-db-ja.com

PreparedStatementとConnectionのどちらを最初に閉じる必要がありますか?

JDBCでPreparedStatementを使用する場合、最初にPreparedStatementを閉じるか、最初にConnectionを閉じる必要がありますか? Connectionを最初に閉じるコードサンプルを見たばかりですが、最初にPreparedStatementを閉じる方が論理的だと思います。

これを行うための標準的な、受け入れられた方法はありますか?それは重要ですか? ConnectionPreparedStatementオブジェクトに直接関連しているため、PreparedStatementを閉じると、Connectionも閉じられますか?

25
froadie

ステートメント。私はあなたが(順番に)閉じることを期待します

  1. 結果セット
  2. ステートメント
  3. 接続

(そして途中でnullをチェックしてください!)

つまり、オープニングシーケンスにreverseの順序で閉じます。

Spring JdbcTemplate (または同様のもの)を使用している場合は、これが自動的に処理されます。または、 Apache Commons DbUtils およびDbUtils.close()または DbUtils.closeQuietly() を使用することもできます。

40
Brian Agnew

次の手順を(順番に)実行する必要があります

  • ResultSet
  • PreparedStatement
  • Connection

また、クローズを保証するために、finallyclose内のすべてのJDBC関連オブジェクトをクローズすることをお勧めします。

//Do the following when dealing with JDBC. This is how I've implemented my JDBC transactions through DAO....

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
  conn = ....
  ps = conn.prepareStatement(...);

  //Populate PreparedStatement
  rs = ps.executeQuery();

} catch (/*All relevant exceptions such as SQLException*/Exception e) {
  logger.error("Damn, stupid exception: " , e);
} finally {
if (rs != null) {
            try {
                rs.close();
                rs = null;
            } catch (SQLException e) {
                logger.error(e.getMessage(), e.fillInStackTrace());
            }
        }

        if (ps != null) {
            try {
                ps.close();
                ps = null;
            } catch (SQLException e) {
                logger.error(e.getMessage(), e.fillInStackTrace());
            }
        }

        try {
            if (conn!= null && !conn.isClosed()){
                if (!conn.getAutoCommit()) {
                    conn.commit();
                    conn.setAutoCommit(true);
                }
                conn.close();
                conn= null;
            }
        } catch (SQLException sqle) {
            logger.error(sqle.getMessage(), sqle.fillInStackTrace());
        }
}

オブジェクトがnullであるかどうかを確認したことがわかります。接続については、接続が自動コミットされていないかどうかを確認してくださいfirst。多くの人がそれをチェックせず、トランザクションがDBにコミットされていないことに気づきます。

7
Buhake Sindi