Otwarcie połączenia db za każdym razem, gdy jest potrzebne, jest marnowaniem zasobów i jest powolne.
Zamiast tego powinieneś utworzyć sql.DB
raz, kiedy aplikacja zostanie uruchomiona (lub na pierwsze żądanie) i albo przekaż ją tam, gdzie jest potrzebna (np. jako parametr funkcji lub przez jakiś kontekst), albo po prostu ustaw ją jako zmienną globalną, aby każdy miał do niej dostęp. Bezpiecznie jest dzwonić z wielu gorutyn.
Cytując z dokumentacji sql.Open()
:
Zwrócony DB jest bezpieczny do współbieżnego używania przez wiele gorutyn i utrzymuje własną pulę bezczynnych połączeń. Dlatego funkcję Open należy wywołać tylko raz. Rzadko jest konieczne zamknięcie bazy danych.
Możesz użyć pakietu init()
funkcja do inicjalizacji:
var db *sql.DB
func init() {
var err error
db, err = sql.Open("yourdriver", "yourDs")
if err != nil {
log.Fatal("Invalid DB config:", err)
}
}
Należy zauważyć, że sql.Open()
może nie utworzyć rzeczywistego połączenia z bazą danych, może po prostu zweryfikować swoje argumenty. Aby sprawdzić, czy rzeczywiście możesz połączyć się z bazą danych, użyj DB.Ping()
, np.:
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)
}
}