Какие ресурсы базы данных потребляет незакрытое соединение без активных запросов?

«Какие ресурсы базы данных потребляет незакрытое соединение без активных запросов?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Незакрытое ("висящее") соединение удерживает следующие ресурсы на стороне сервера СУБД:

  • Память: Под структуры данных сессии, буферы и контекст выполнения.
  • Управление соединениями: Занятый слот в пуле соединений, что может привести к его исчерпанию для других приложений.
  • Блокировки: Если соединение оставило транзакцию открытой (autocommit=false), удерживаемые блокировки могут препятствовать работе других сессий.
  • Временные объекты: Курсоры или временные таблицы могут не освобождаться своевременно.

Пример плохой практики (утечка соединения):

Connection conn = DriverManager.getConnection(url);
// Работа с БД...
// Забыли вызвать conn.close() - соединение остается активным.

Как избежать:

  1. Всегда используйте try-with-resources (Java 7+) для гарантированного закрытия:
    try (Connection conn = dataSource.getConnection();
     Statement stmt = conn.createStatement()) {
    // Работа с БД
    } // conn.close() вызывается автоматически.
  2. Настройте таймауты в пуле соединений (например, idleTimeout в HikariCP).
  3. Используйте шаблоны (например, JdbcTemplate в Spring), которые управляют жизненным циклом соединения за вас.