为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
神不在的星期二 2022-04-20 17:55:48
我的 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 作为参数传递给相应的函数,而不是在每个函数中打开连接吗?
查看完整描述

2 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

每次需要时都打开数据库连接是一种资源浪费,而且速度很慢。


相反,您应该在应用程序启动时(或在第一次需要时)创建sql.DB一次,然后将其传递到需要的地方(例如作为函数参数或通过某些上下文),或者简单地将其设为全局变量,这样每个人都可以访问它。从多个 goroutine 调用是安全的。


引用以下文档sql.Open():


返回的数据库对于多个 goroutine 并发使用是安全的,并维护自己的空闲连接池。因此,Open 函数应该只被调用一次。很少需要关闭数据库。


您可以使用包init()函数对其进行初始化:


var db *sql.DB


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

    }

}


查看完整回答
反对 回复 2022-04-20
?
潇湘沐

TA贡献1816条经验 获得超6个赞

我将使用 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


查看完整回答
反对 回复 2022-04-20
  • 2 回答
  • 0 关注
  • 454 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号