sql.Open öppnar inte riktigt en anslutning till din databas.
En sql.DB upprätthåller en pool av anslutningar till din databas. Varje gång du frågar efter din databas kommer ditt program att försöka få en anslutning från denna pool eller skapa en ny på annat sätt. Dessa anslutningar sätts sedan tillbaka i poolen när du stänger dem.
Detta är vad rows.Close()
gör.Din db.QueryRow("...")
gör samma sak internt när du anropar Scan(...)
.
Det grundläggande problemet är att du skapar för många frågor, av vilka var och en behöver en anslutning, men du stänger inte dina anslutningar tillräckligt snabbt. På så sätt måste ditt program skapa en ny anslutning för varje fråga.
Du kan begränsa det maximala antalet anslutningar som ditt program använder genom att anropa SetMaxOpenConns på din sql.DB.
Se http://go-database-sql.org/surprises.html för mer information.