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

我应该多久在我的程序中调用 sql.Open?

我应该多久在我的程序中调用 sql.Open?

Go
白板的微信 2021-11-22 15:03:12
正如标题所说,我不知道有多条sql.Open语句是好事还是坏事,或者我是否应该有一个只有 init 的文件,例如:var db *sql.DBfunc init() {    var err error    db, err = sql.Open}只是想知道最佳实践是什么。谢谢!
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

您至少应该检查错误。

如“连接到数据库”中所述:


请注意,Open不会直接打开数据库连接:这会推迟到进行查询时。要在进行查询之前验证是否可以建立连接,请使用以下Ping函数:


if err := db.Ping(); err != nil {

  log.Fatal(err)

}

使用后,使用 Close 关闭数据库。


如果可能,将打开的数据库连接数限制为最少。

参见“ Go/Golang sql.DB 在函数中的重用”:


您不需要到处打开数据库连接。

该database/sql包在内部进行连接池,根据需要打开和关闭连接,同时提供可以同时使用的单个连接的错觉。


正如elithrar在评论中指出的那样,database.sql/#Open确实提到:


返回的数据库对于多个 goroutine 并发使用是安全的,并维护自己的空闲连接池。

因此,该Open函数应该只调用一次。

很少需要关闭数据库。


正如这里提到的


*sql.DB全局声明还有一些额外的好处,例如SetMaxIdleConns(调节连接池大小)或准备跨应用程序的 SQL 语句。


你可以使用一个函数init,即使你没有它也会运行main():


var db *sql.DB

func init() {

    db, err = sql.Open(DBparms....)

}

init()总是被调用,不管有没有 main,所以如果你导入一个有 init 函数的包,它就会被执行。每个包

可以有多个init()函数,它们将按照它们在代码中显示的顺序执行(当然在所有变量都初始化之后)。


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信