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)
}
}
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
- 2 回答
- 0 关注
- 454 浏览
添加回答
举报
