sql.Open всъщност не отваря връзка с вашата база данни.
sql.DB поддържа пул от връзки към вашата база данни. Всеки път, когато заявите вашата база данни, вашата програма ще се опита да получи връзка от този пул или ще създаде нова в противен случай. Тези връзки се връщат обратно в пула, след като ги затворите.
Това е, което rows.Close()
прави.Вашият db.QueryRow("...")
прави същото вътрешно, когато извикате Scan(...)
.
Основният проблем е, че създавате твърде много заявки, всяка от които се нуждае от връзка, но не затваряте връзките си достатъчно бързо. По този начин вашата програма трябва да създаде нова връзка за всяка заявка.
Можете да ограничите максималния брой връзки, които вашата програма използва, като извикате SetMaxOpenConns във вашата sql.DB.
Вижте http://go-database-sql.org/surprises.html за повече информация.