sql.Open não abre realmente uma conexão com seu banco de dados.
Um sql.DB mantém um pool de conexões com seu banco de dados. Cada vez que você consultar seu banco de dados, seu programa tentará obter uma conexão desse pool ou criar um novo caso contrário. Essas conexões são então colocadas de volta no pool assim que você as fecha.
Isto é o que
rows.Close()
faz.Seu db.QueryRow("...")
faz a mesma coisa internamente quando você chama Scan(...)
. O problema básico é que você está criando muitas consultas, das quais cada uma precisa de uma conexão, mas você não está fechando suas conexões com rapidez suficiente. Dessa forma, seu programa deve criar uma nova conexão para cada consulta.
Você pode limitar o número máximo de conexões que seu programa usa chamando SetMaxOpenConns em seu sql.DB.
Consulte http://go-database-sql.org/surprises.html Para maiores informações.