sql.Open không thực sự mở kết nối với cơ sở dữ liệu của bạn.
Một sql.DB duy trì một nhóm các kết nối đến cơ sở dữ liệu của bạn. Mỗi khi bạn truy vấn cơ sở dữ liệu của mình, chương trình của bạn sẽ cố gắng lấy kết nối từ nhóm này hoặc tạo một kết nối mới. Các kết nối này sẽ không được đưa trở lại nhóm sau khi bạn đóng chúng.
Đây là những gì rows.Close()
hiện tại của bạn db.QueryRow("...")
thực hiện điều tương tự trong nội bộ khi bạn gọi Scan(...)
.
Vấn đề cơ bản là bạn đang tạo quá nhiều truy vấn, trong đó mỗi truy vấn cần một kết nối, nhưng bạn không đóng các kết nối của mình đủ nhanh. Bằng cách này, chương trình của bạn phải tạo một kết nối mới cho mỗi truy vấn.
Bạn có thể giới hạn số lượng kết nối tối đa mà chương trình của mình sử dụng bằng cách gọi SetMaxOpenConns trên sql.DB của bạn.
Xem http://go-database-sql.org/surctures.html để biết thêm thông tin.