С формой Java 6, я думаю, лучше проверить, закрыта она или нет перед закрытием (например, если какой-либо пул соединений высвобождает соединение в другом потоке) - например, некоторая проблема сети - оператор и состояние набора результатов могут быть закрыты,(это случается не часто, но у меня была эта проблема с Oracle и DBCP).Мой шаблон для этого (в более старом синтаксисе Java):
try {
...
return resp;
} finally {
if (rs != null && !rs.isClosed()) {
try {
rs.close();
} catch (Exception e2) {
log.warn("Cannot close resultset: " + e2.getMessage());
}
}
if (stmt != null && !stmt.isClosed()) {
try {
stmt.close();
} catch (Exception e2) {
log.warn("Cannot close statement " + e2.getMessage());
}
}
if (con != null && !conn.isClosed()) {
try {
con.close();
} catch (Exception e2) {
log.warn("Cannot close connection: " + e2.getMessage());
}
}
Теоретически он не идеален на 100%, потому что между проверкой состояния закрытия и самим закрытием остается мало места для изменениядля гос.В худшем случае вы получите предупреждение в течение длительного времени.- но это меньше, чем возможность изменения состояния в долгосрочных запросах.Мы используем этот шаблон в производстве с нагрузкой «avarage» (150 одновременных пользователей), и у нас не было никаких проблем с ним - поэтому никогда не смотрите это предупреждающее сообщение.