Att öppna en db-anslutning varje gång den behövs är ett slöseri med resurser och det går långsamt.
Istället bör du skapa en sql.DB
en gång, när din applikation startar (eller på första begäran), och antingen skicka den där den behövs (t.ex. som en funktionsparameter eller via något sammanhang), eller helt enkelt göra den till en global variabel så att alla kan komma åt den. Det är säkert att ringa från flera goroutiner.
Citerar från dokumentet för sql.Open()
:
Den returnerade DB är säker för samtidig användning av flera goroutiner och upprätthåller sin egen pool av lediga anslutningar. Därför bör funktionen Öppna bara anropas en gång. Det är sällan nödvändigt att stänga en DB.
Du kan använda ett paket init()
funktion för att initiera 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 sak att notera här är att sql.Open()
kanske inte skapar en faktisk anslutning till din DB, det kanske bara validerar dess argument. För att testa om du faktiskt kan ansluta till db, använd DB.Ping()
, t.ex.:
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)
}
}