PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come gestisco l'apertura/chiusura della connessione Db in un'app Go?

Aprire una connessione db ogni volta che serve è uno spreco di risorse ed è lento.

Invece, dovresti creare un sql.DB una volta, all'avvio dell'applicazione (o alla prima richiesta), e passarla dove è necessario (ad esempio come parametro di funzione o tramite un contesto), o semplicemente trasformarla in una variabile globale in modo che tutti possano accedervi. È sicuro chiamare da più goroutine.

Citando dal documento di sql.Open() :

Il DB restituito è sicuro per l'uso simultaneo da parte di più goroutine e mantiene il proprio pool di connessioni inattive. Pertanto, la funzione Apri dovrebbe essere chiamata solo una volta. Raramente è necessario chiudere un DB.

Puoi usare un pacchetto init() funzione per inizializzarlo:

var db *sql.DB

func init() {
    var err error
    db, err = sql.Open("yourdriver", "yourDs")
    if err != nil {
        log.Fatal("Invalid DB config:", err)
    }
}

Una cosa da notare qui è che sql.Open() potrebbe non creare una connessione effettiva al tuo DB, potrebbe semplicemente convalidare i suoi argomenti. Per verificare se puoi effettivamente connetterti al db, usa DB.Ping() , ad esempio:

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)
    }
}