Когда вы закончите использовать Connection
, вам нужно явно закрыть его, вызвав его метод close()
, чтобы высвободить любые другие ресурсы базы данных (курсоры, дескрипторы и т. Д.), К которым может удерживаться соединение.
На самом деле, безопасный шаблон в Java - закрывать ваши ResultSet
, Statement
и Connection
(в этом порядке) в блоке finally
, когда вы закончите с ними, что-то вроде этого:
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// Do stuff
...
} catch (SQLException ex) {
// Exception handling stuff
...
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) { /* ignored */}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) { /* ignored */}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { /* ignored */}
}
}
Блок finally
можно немного улучшить (чтобы избежать проверки на ноль):
} finally {
try { rs.close(); } catch (Exception e) { /* ignored */ }
try { ps.close(); } catch (Exception e) { /* ignored */ }
try { conn.close(); } catch (Exception e) { /* ignored */ }
}
Но, тем не менее, это очень многословно, поэтому вы обычно используете вспомогательный класс для закрытия объектов в нулевых безопасных вспомогательных методах, и блок finally
становится примерно таким:
} finally {
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(ps);
DbUtils.closeQuietly(conn);
}
И, собственно, Apache Commons DbUtils имеет класс DbUtils
, который точно делает это, поэтому нет необходимости писать свой собственный.