在多线程应用程序中使用gorm的最佳方式是什么?

在多线程应用程序中使用gorm的最佳方式是什么?,go,go-gorm,gorm-mysql,Go,Go Gorm,Gorm Mysql,我有一个应用程序可以打开很多例程。比如说2000个动作。每个例程都需要访问数据库,或者至少需要更新/选择数据库中的数据 我目前的做法如下: 例程使用DB.GetConnection()获取*gorm.DB,这是此函数的代码: func GetConnection() *gorm.DB { DBConfig := config.GetConfig().DB db, err := gorm.Open("mysql", DBConfig.DBUser+":

我有一个应用程序可以打开很多例程。比如说2000个动作。每个例程都需要访问数据库,或者至少需要更新/选择数据库中的数据

我目前的做法如下:

例程使用
DB.GetConnection()
获取
*gorm.DB
,这是此函数的代码:

func GetConnection() *gorm.DB {
    DBConfig := config.GetConfig().DB
    db, err := gorm.Open("mysql", DBConfig.DBUser+":"+DBConfig.DBPassword+"@/"+DBConfig.DBName+"?charset=utf8mb4")
    if err != nil {
        panic(err.Error())
    }
    return db
}
然后例程从某个存储包调用另一个函数,并将
*gorm.DB
传递到函数并关闭连接,如下所示:

dbConnection := db.GetConnection()
postStorage.UpdateSomething(dbConnection)
db.CloseConnection(dbConnection)
以上只是一个例子,主要思想是每个例程都会打开新的连接,我不喜欢它。因为它可能会使数据库过载。结果我得到了下一个MySQL错误:

[mysql] 2020/07/16 19:34:26 packets.go:37: read tcp 127.0.0.1:44170->127.0.0.1:3306: read: connection reset by peer

问题是关于好的模式如何在多例程应用程序中使用
gorm
包?

*gorm.DB
是多线程安全的,您可以在多例程中使用一个
*gorm.DB
。你可以初始化它一次,然后在你想要的时候得到它。演示:

package db

var db *gorm.DB

fund init() {
    DBConfig := config.GetConfig().DB
    db, err := gorm.Open("mysql", DBConfig.DBUser+":"+DBConfig.DBPassword+"@/"+DBConfig.DBName+"?charset=utf8mb4")
    if err != nil {
        panic(err.Error())
    }
}

func GetConnection() *gorm.DB {
    return db;
}

*gorm.DB
是多线程安全的,您可以在多个例程中使用一个
*gorm.DB
。你可以初始化它一次,然后在你想要的时候得到它。演示:

package db

var db *gorm.DB

fund init() {
    DBConfig := config.GetConfig().DB
    db, err := gorm.Open("mysql", DBConfig.DBUser+":"+DBConfig.DBPassword+"@/"+DBConfig.DBName+"?charset=utf8mb4")
    if err != nil {
        panic(err.Error())
    }
}

func GetConnection() *gorm.DB {
    return db;
}

谢谢但若我在应用程序启动时初始化它一次,那个么我怎么能使它保持活动状态呢?因为应用程序总是在运行。我想在没有查询的情况下,mysql会关闭连接,然后当应用程序进行查询时,我会得到错误。。请澄清这一点moment@Mikael它取决于您导入的驱动程序和
数据库/sql
。例如,是Go的
数据库/sql
的MySQL驱动程序。默认情况下,它将帮助您维护连接池,执行诸如保持连接活动、在负载下扩展(当许多goroutine正在积极使用数据库时)以及在静态时收缩之类的操作。所以你可能不需要担心。谢谢,非常有用!对不起,还有一个问题,我需要关闭连接吗?我尝试了
*gorm.DB.Close()
,但是其他例程说连接已关闭。@Mikael关于注释中的最后一个问题,如果您没有,并且如果您的应用程序意外终止(例如被终止),则这取决于数据库服务器在关闭连接之前可以空闲多长时间,您可以在该行为上配置数据库服务器。谢谢!但若我在应用程序启动时初始化它一次,那个么我怎么能使它保持活动状态呢?因为应用程序总是在运行。我想在没有查询的情况下,mysql会关闭连接,然后当应用程序进行查询时,我会得到错误。。请澄清这一点moment@Mikael它取决于您导入的驱动程序和
数据库/sql
。例如,是Go的
数据库/sql
的MySQL驱动程序。默认情况下,它将帮助您维护连接池,执行诸如保持连接活动、在负载下扩展(当许多goroutine正在积极使用数据库时)以及在静态时收缩之类的操作。所以你可能不需要担心。谢谢,非常有用!对不起,还有一个问题,我需要关闭连接吗?我尝试了
*gorm.DB.Close()
,但是其他例程说连接已关闭。@Mikael关于注释中的最后一个问题,如果您没有,并且如果您的应用程序意外终止(例如被终止),则这取决于数据库服务器在关闭连接之前可以空闲多长时间,您可以在该行为上配置数据库服务器。