Việc mở kết nối db mỗi khi cần thiết sẽ gây lãng phí tài nguyên và nó rất chậm.
Thay vào đó, bạn nên tạo một sql.DB
một lần, khi ứng dụng của bạn khởi động (hoặc theo yêu cầu đầu tiên) và chuyển nó vào nơi cần thiết (ví dụ:dưới dạng một tham số hàm hoặc thông qua một số ngữ cảnh) hoặc chỉ cần đặt nó trở thành một biến toàn cục và để mọi người có thể truy cập nó. Thật an toàn khi gọi từ nhiều goroutines.
Trích dẫn từ tài liệu của sql.Open()
:
DB trả về là an toàn để sử dụng đồng thời bởi nhiều goroutines và duy trì nhóm kết nối nhàn rỗi của riêng nó. Do đó, hàm Open chỉ nên được gọi một lần. Ít khi cần thiết phải đóng một DB.
Bạn có thể sử dụng một gói init()
hàm để khởi tạo nó:
var db *sql.DB
func init() {
var err error
db, err = sql.Open("yourdriver", "yourDs")
if err != nil {
log.Fatal("Invalid DB config:", err)
}
}
Một điều cần lưu ý ở đây là sql.Open()
có thể không tạo ra một kết nối thực sự với DB của bạn, nó có thể chỉ xác thực các đối số của nó. Để kiểm tra xem bạn có thể thực sự kết nối với db hay không, hãy sử dụng DB.Ping()
, ví dụ:
func init() {
var err error
db, err = sql.Open("yourdriver", "yourDs")
if err != nil {
log.Fatal("Invalid DB config:", err)
}
if err = db.Ping(); err != nil {
log.Fatal("DB unreachable:", err)
}
}