gpt4 book ai didi

sql - Go 中使用 SQL 驱动程序的连接池

转载 作者:IT王子 更新时间:2023-10-29 01:18:29 27 4
gpt4 key购买 nike

用 Go 语言存储与数据库的连接的最佳做法是什么?

例如,在 Java 中,您可以使用单例、一些 IoC 容器,例如 Spring。它生命周期中的最佳实践是什么?申请关闭后如何释放?

最佳答案

在这里使用单例模式也没有错。

我会用这样的东西:

var db *sql.DB = nil

func GetDB() (*sql.DB, error) {
if db == nil {
conn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require",
DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
log.Println("Creating a new connection: %v", conn)

d, err := sql.Open("postgres", conn)
if err != nil {
return nil, err
}
db = d
}

return db, nil
}

使用这个导出函数,您可以接收来自所有其他包的连接。

根据评论更新答案(感谢@all 提供信息)!

The returned DB is safe for concurrent use by multiple goroutines and maintains its own pool of idle connections. Thus, the Open function should be called just once. It is rarely necessary to close a DB.¹

It is rare to Close a DB, as the DB handle is meant to be long-lived and shared between many goroutines.²

我会说没有强制理由在数据库连接上调用关闭。我没有发现其他陈述。尽管如此,我还是会在 main 函数中使用 defer GetDB().close() - 只是为了代码的完整性。

我要注意的另一件事是连接应该通过 db.Ping() 验证,否则可以建立连接但数据库可能不存在。

有了这些新信息,我就不会费心使用一些互斥锁来确保数据库已建立。我会创建一个新的 DBInit() 并在主包的 init() 函数中运行它。

关于sql - Go 中使用 SQL 驱动程序的连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33995668/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com