正如标题所说,我不知道是否有多个sql.Open
语句是好事还是坏事,或者我应该拥有一个只有一个init的文件:
var db *sql.DB
func init() {
var err error
db, err = sql.Open
}
只是想知道最佳做法是什么。谢谢!
答案 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 comment,database.sql/#Open
确实提到了:
返回的数据库可以安全地由多个goroutine并发使用,并维护自己的空闲连接池 因此,
Open
函数只应调用一次。
很少需要关闭数据库。
全局声明
*sql.DB
还有一些额外的好处,例如SetMaxIdleConns
(规范连接池大小)或整个应用程序的preparing SQL语句。
您可以使用function init
,即使您没有main()
,也会运行{/ 3}}:
var db *sql.DB
func init() {
db, err = sql.Open(DBparms....)
}
始终会调用
init()
,无论是否存在main,因此如果导入具有init函数的包,它将被执行。
每个包可以有多个init()
函数,它们将按照它们在代码中显示的顺序执行(当然,在所有变量初始化之后)。