At åbne en db-forbindelse, hver gang det er nødvendigt, er spild af ressourcer, og det er langsomt.
I stedet skal du oprette en sql.DB
én gang, når din applikation starter (eller på første efterspørgsel), og enten videregive den, hvor den er nødvendig (f.eks. som en funktionsparameter eller via en kontekst), eller blot gøre den til en global variabel, så alle kan få adgang til den. Det er sikkert at ringe fra flere goroutiner.
Citerer fra dokumentet til sql.Open()
:
Den returnerede DB er sikker til samtidig brug af flere goroutiner og vedligeholder sin egen pulje af ledige forbindelser. Derfor skal funktionen Åbn kun kaldes én gang. Det er sjældent nødvendigt at lukke en DB.
Du kan bruge en pakke init()
funktion for at initialisere den:
var db *sql.DB
func init() {
var err error
db, err = sql.Open("yourdriver", "yourDs")
if err != nil {
log.Fatal("Invalid DB config:", err)
}
}
En ting at bemærke her er, at sql.Open()
skaber muligvis ikke en egentlig forbindelse til din DB, den kan bare validere dens argumenter. For at teste, om du rent faktisk kan oprette forbindelse til db'en, skal du bruge DB.Ping()
, f.eks.:
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)
}
}