sql.Open tidak benar-benar membuka koneksi ke database Anda.
sql.DB memelihara kumpulan koneksi ke database Anda. Setiap kali Anda menanyakan database Anda, program Anda akan mencoba untuk mendapatkan koneksi dari kumpulan ini atau membuat yang baru jika tidak. Sambungan ini kemudian dimasukkan kembali ke dalam kumpulan setelah Anda menutupnya.
Inilah yang rows.Close()
tidak. db.QueryRow("...")
melakukan hal yang sama secara internal saat Anda memanggil Scan(...)
.
Masalah dasarnya adalah Anda membuat terlalu banyak kueri, yang masing-masing membutuhkan koneksi, tetapi Anda tidak menutup koneksi dengan cukup cepat. Dengan cara ini program Anda harus membuat koneksi baru untuk setiap kueri.
Anda dapat membatasi jumlah maksimum koneksi yang digunakan program Anda dengan memanggil SetMaxOpenConns di sql.DB Anda.
Lihat http://go-database-sql.org/surprises.html untuk informasi lebih lanjut.