Который я должен закрыть первым, PreparedStatement или Connection?
При использовании PreparedStatement
в JDBC мне нужно сначала закрыть PreparedStatement
или Connection
? Я просто видел образец кода, в котором сначала закрывается Connection
, но мне кажется логичным сначала закрыть PreparedStatement
.
Есть ли стандартный, принятый способ сделать это? Это имеет значение? Закрывает ли Connection
закрытие PreparedStatement
, так как PreparedStatement
напрямую связан с объектом Connection
?
Ответы
Ответ 1
Утверждение. Я ожидаю, что вы закроете (по порядку)
- набор результатов
- утверждение
- соединение
(и проверить нули в пути!)
то есть. закрыть в обратном порядке до последовательности открытия.
Если вы используете Spring JdbcTemplate (или подобное), то это будет за вами. В качестве альтернативы вы можете использовать Apache Commons DbUtils и DbUtils.close()
или DbUtils.closeQuietly()
.
Ответ 2
Следующие процедуры должны быть выполнены (в порядке)
-
ResultSet
-
PreparedStatement
-
Connection
.
Кроме того, рекомендуется закрыть все связанные объекты JDBC в finally
, чтобы гарантировать закрытие.
//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());
}
}
Вы можете видеть, что я проверил, являются ли мои объекты пустыми и для подключения, проверьте first, если соединение не автокомментировано. Многие люди не могут проверить это и понять, что транзакция не была передана БД.