Соединение с базой данных принадлежит и управляется базой данных, класс просто предоставляет вам доступ к этому ресурсу базы данных. Если вы не закроете соединение, тогда класс Java может быть подвергнут сборке мусора, но база данных может не сказать, что соединение больше не используется, что может привести к потере ресурсов базы данных (до истечения времени ожидания на стороне базы данных). ) или даже утечка.
Итак, когда вы закончили использовать 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 {
DbUtil.closeQuietly(rs);
DbUtil.closeQuietly(ps);
DbUtil.closeQuietly(conn);
}
И, собственно, Apache Commons DbUtils имеет класс DbUtils
, который точно делает это, поэтому нет необходимости писать свой собственный.
В вашем случае это решит проблему исключения, но не отладки (и вы будете тратить ресурсы базы данных до истечения времени ожидания на стороне базы данных). Итак, 1. не отлаживайте свой код с помощью производственной базы данных 2. попробуйте выполнить сеанс отладки до конца.