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