您可以创建一个名为 database 的包并在 init.go 文件中编写一个 init 函数,该函数可以为您拥有的每个数据库创建一个 DB 对象来连接数据库。您可以在应用程序中的任何地方使用此 db 对象,这也将启用连接池。
初始化.go
var db *gorm.DB
func init() {
var err error
dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbPort, dbName)
db, err = gorm.Open("mysql", dataSourceName)
db.DB().SetConnMaxLifetime(10 * time.Second)
db.DB().SetMaxIdleConns(10)
//initialise other db objects here
}
用户.go
func getFirstUser() (user User) {
db.First(&user)
return
}
PS> 如果您必须连接到 1 或 2 个数据库,此解决方案会很有效。如果您需要同时连接到多个数据库,您应该使用 dbresolver 插件。
旧答案
您可以编写一个单独的函数,每次调用该函数时返回当前数据库连接对象。
func getDBConnection(dbUser, dbPassword, dbHost, dbName string) (db *gorm.DB, err error) {
dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbPort, dbName)
db, err = gorm.Open("mysql", dataSourceName)
db.DB().SetConnMaxLifetime(10 * time.Second)
return
}
并且每次调用 getDBConnection 函数后调用 defer db.Close() 。
func getFirstUser() (user User) {
db, _ := getDBConnection()
defer db.Close()
db.First(&user)
return
}
这样,每次执行查询后,您的连接都会关闭。