猿问

如何在 Go 应用程序中处理打开/关闭 Db 连接?

我的 Web API 应用程序中有一组函数。他们对 Postgres 数据库中的数据执行一些操作。


func CreateUser () {

    db, err := sql.Open("postgres", "user=postgres password=password dbname=api_dev sslmode=disable")

    // Do some db operations here

}

我想函数应该彼此独立地与 db 一起工作,所以现在我sql.Open(...)在每个函数内部都有。我不知道这是否是管理数据库连接的正确方法。


我应该在应用程序启动后在某个地方打开它并将 db 作为参数传递给相应的函数,而不是在每个函数中打开连接吗?


神不在的星期二
浏览 455回答 2
2回答

一只斗牛犬

每次需要时都打开数据库连接是一种资源浪费,而且速度很慢。相反,您应该在应用程序启动时(或在第一次需要时)创建sql.DB一次,然后将其传递到需要的地方(例如作为函数参数或通过某些上下文),或者简单地将其设为全局变量,这样每个人都可以访问它。从多个 goroutine 调用是安全的。引用以下文档sql.Open():返回的数据库对于多个 goroutine 并发使用是安全的,并维护自己的空闲连接池。因此,Open 函数应该只被调用一次。很少需要关闭数据库。您可以使用包init()函数对其进行初始化:var db *sql.DBfunc init() {    var err error    db, err = sql.Open("yourdriver", "yourDs")    if err != nil {        log.Fatal("Invalid DB config:", err)    }}这里要注意的一件事是,它sql.Open()可能不会创建与您的数据库的实际连接,它可能只是验证其参数。要测试您是否可以实际连接到数据库,请使用DB.Ping(),例如: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)    }}

潇湘沐

我将使用 postgres 示例package main导入必要的包,不要忘记 postgres 驱动程序import (  "database/sql"  _ "github.com/lib/pq" //postgres driver)在包范围内初始化您的连接var db *sql.DB为您的连接提供初始化功能func init() {  var err error  db, err = sql.open("postgres", "connectionString")  //connectioString example => 'postgres://username:password@localhost/dbName?sslmode=disable'  if err != nil {    panic(err)  }  err = db.Ping()  if err != nil {    panic(err)  }  // note, we haven't deffered db.Close() at the init function since the connection will close after init. you could close it at main or ommit it}主功能func main() {defer db.Close() //optional//run your db functions}查看此示例 https://play.golang.org/p/FAiGbqeJG0H
随时随地看视频慕课网APP

相关分类

Go
我要回答