Abrir uma conexão de banco de dados sempre que necessário é um desperdício de recursos e é lento.
Em vez disso, você deve criar um
sql.DB
uma vez, quando seu aplicativo for iniciado (ou na primeira demanda), e passá-lo onde for necessário (por exemplo, como um parâmetro de função ou por meio de algum contexto), ou simplesmente torná-lo uma variável global e para que todos possam acessá-lo. É seguro ligar de várias goroutines. Citando do documento de
sql.Open()
:
O banco de dados retornado é seguro para uso simultâneo por várias goroutines e mantém seu próprio pool de conexões ociosas. Assim, a função Open deve ser chamada apenas uma vez. Raramente é necessário fechar um banco de dados.
Você pode usar um pacote
init()
função para inicializá-lo:var db *sql.DB
func init() {
var err error
db, err = sql.Open("yourdriver", "yourDs")
if err != nil {
log.Fatal("Invalid DB config:", err)
}
}
Uma coisa a notar aqui é que
sql.Open()
pode não criar uma conexão real com seu banco de dados, pode apenas validar seus argumentos. Para testar se você pode realmente se conectar ao banco de dados, use DB.Ping()
, por exemplo.: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)
}
}