sql.Open tak naprawdę nie otwiera połączenia z Twoją bazą danych.
sql.DB utrzymuje pulę połączeń z bazą danych. Za każdym razem, gdy wysyłasz zapytanie do bazy danych, program będzie próbował uzyskać połączenie z tej puli lub w inny sposób utworzyć nowe. Te połączenia są następnie umieszczane z powrotem w puli po ich zamknięciu.
To właśnie rows.Close()
robi.Twój db.QueryRow("...")
robi to samo wewnętrznie, gdy wywołujesz Scan(...)
.
Podstawowym problemem jest to, że tworzysz zbyt wiele zapytań, z których każde wymaga połączenia, ale nie zamykasz swoich połączeń wystarczająco szybko. W ten sposób Twój program musi utworzyć nowe połączenie dla każdego zapytania.
Możesz ograniczyć maksymalną liczbę połączeń używanych przez program, wywołując SetMaxOpenConns w Twojej sql.DB.
Zobacz http://go-database-sql.org/surprises.html aby uzyskać więcej informacji.