🟡 Средний · 2 очк. SQL
Что произойдет, если не вызвать rows.Close() после db.Query() в Go?
A Ничего, GC закроет автоматически
B Утечка соединения из пула sql.DB; при достижении MaxOpenConns новые запросы будут блокироваться
C Паника
D Данные не будут прочитаны
Объяснение вопроса

sql.Rows удерживает соединение из пула sql.DB до вызова Close(). Если забыть закрыть rows, соединение "утекает":

// Утечка соединения:
rows, err := db.Query("SELECT id FROM users")
if err != nil { return err }
// забыли defer rows.Close()!
for rows.Next() { ... }

// Правильно:
rows, err := db.Query("SELECT id FROM users")
if err != nil { return err }
defer rows.Close()  // обязательно!
for rows.Next() { ... }
if err := rows.Err(); err != nil { return err }

Последствия утечки:

  • При SetMaxOpenConns(25) после 25 утечек все новые запросы зависнут навсегда
  • Приложение "замирает" без явных ошибок - сложно диагностировать

Для одной строки используйте db.QueryRow() - не требует Close().

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.