sql.Open ve skutečnosti neotevře připojení k vaší databázi.
Sql.DB udržuje fond připojení k vaší databázi. Pokaždé, když zadáte dotaz na databázi, váš program se pokusí získat připojení z tohoto fondu nebo jinak vytvoří nové. Tato připojení se poté vrátí zpět do fondu, jakmile je zavřete.
To je to, co rows.Close()
does.Your db.QueryRow("...")
dělá totéž interně, když voláte Scan(...)
.
Základní problém je, že vytváříte příliš mnoho dotazů, z nichž každý potřebuje připojení, ale neuzavíráte svá připojení dostatečně rychle. Tímto způsobem musí váš program vytvořit nové připojení pro každý dotaz.
Maximální počet připojení, která váš program používá, můžete omezit voláním SetMaxOpenConns na vašem sql.DB.
Viz http://go-database-sql.org/surprises.html pro více informací.