Membuka koneksi db setiap kali dibutuhkan adalah pemborosan sumber daya dan lambat.
Sebagai gantinya, Anda harus membuat sql.DB
sekali, ketika aplikasi Anda dimulai (atau pada permintaan pertama), dan meneruskannya di tempat yang dibutuhkan (misalnya sebagai parameter fungsi atau melalui beberapa konteks), atau cukup menjadikannya sebagai variabel global sehingga semua orang dapat mengaksesnya. Aman untuk menelepon dari beberapa goroutine.
Mengutip dari dokumen sql.Open()
:
DB yang dikembalikan aman untuk digunakan secara bersamaan oleh beberapa goroutine dan memelihara kumpulan koneksi idle-nya sendiri. Dengan demikian, fungsi Open harus dipanggil sekali saja. Jarang diperlukan untuk menutup DB.
Anda dapat menggunakan paket init()
berfungsi untuk menginisialisasinya:
var db *sql.DB
func init() {
var err error
db, err = sql.Open("yourdriver", "yourDs")
if err != nil {
log.Fatal("Invalid DB config:", err)
}
}
Satu hal yang perlu diperhatikan di sini adalah sql.Open()
mungkin tidak membuat koneksi aktual ke DB Anda, mungkin hanya memvalidasi argumennya. Untuk menguji apakah Anda benar-benar dapat terhubung ke db, gunakan DB.Ping()
, misalnya:
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)
}
}