JDBCでPreparedStatement
を使用する場合、最初にPreparedStatement
を閉じるか、最初にConnection
を閉じる必要がありますか? Connection
を最初に閉じるコードサンプルを見たばかりですが、最初にPreparedStatement
を閉じる方が論理的だと思います。
これを行うための標準的な、受け入れられた方法はありますか?それは重要ですか? Connection
はPreparedStatement
オブジェクトに直接関連しているため、PreparedStatement
を閉じると、Connection
も閉じられますか?
ステートメント。私はあなたが(順番に)閉じることを期待します
(そして途中でnullをチェックしてください!)
つまり、オープニングシーケンスにreverseの順序で閉じます。
Spring JdbcTemplate (または同様のもの)を使用している場合は、これが自動的に処理されます。または、 Apache Commons DbUtils およびDbUtils.close()
または DbUtils.closeQuietly()
を使用することもできます。
次の手順を(順番に)実行する必要があります
ResultSet
PreparedStatement
Connection
。また、クローズを保証するために、finally
close内のすべての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にコミットされていないことに気づきます。