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

时间:2015-11-07 03:38:34

标签: go

正如标题所说,我不知道是否有多个sql.Open语句是好事还是坏事,或者我应该拥有一个只有一个init的文件:

var db *sql.DB


func init() {
    var err error
    db, err = sql.Open
}

只是想知道最佳做法是什么。谢谢!

1 个答案:

答案 0 :(得分:4)

您至少应该检查错误 如“Connecting to a database”中所述:

  

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

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

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

如果可能,将打开的数据库连接数限制为最小 请参阅“Go/Golang sql.DB reuse in functions”:

  

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

由于elithrar指出in the commentdatabase.sql/#Open确实提到了:

  

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

作为mentioned here

  

全局声明*sql.DB还有一些额外的好处,例如SetMaxIdleConns(规范连接池大小)或整个应用程序的preparing SQL语句。

您可以使用function init,即使您没有main(),也会运行{/ 3}}:

var db *sql.DB
func init() {
    db, err = sql.Open(DBparms....)
}
  始终会调用

init(),无论是否存在main,因此如果导入具有init函数的包,它将被执行。
  每个包可以有多个init()函数,它们将按照它们在代码中显示的顺序执行(当然,在所有变量初始化之后)。