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 https://go-database-sql.org/surprises.html aby uzyskać więcej informacji.