正如标题所说,我不知道有多条sql.Open语句是好事还是坏事,或者我是否应该有一个只有 init 的文件,例如:
var db *sql.DB
func init() {
var err error
db, err = sql.Open
}
Run Code Online (Sandbox Code Playgroud)
只是想知道最佳做法是什么。谢谢!
您至少应该检查错误。
如“连接到数据库”中所述:
请注意,
Open不会直接打开数据库连接:这会推迟到进行查询时。要在进行查询之前验证是否可以建立连接,请使用以下Ping函数:
if err := db.Ping(); err != nil {
log.Fatal(err)
}
Run Code Online (Sandbox Code Playgroud)
使用后,使用 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....)
}
Run Code Online (Sandbox Code Playgroud)
init()总是被调用,不管有没有 main,所以如果你导入一个有 init 函数的包,它就会被执行。每个包
可以有多个init()函数,它们将按照它们在代码中显示的顺序执行(当然是在所有变量都初始化之后)。
| 归档时间: |
|
| 查看次数: |
1654 次 |
| 最近记录: |