mysql 每次调用gorm.open()时,它都会创建一个新的连接池吗?

czq61nw1  于 2022-10-31  发布在  Mysql
关注(0)|答案(3)|浏览(358)

我正在编写一段代码,它从几个不同的地方调用数据库。在这段代码中,我一直在使用GORM库,并且每次需要与数据库交互时都调用gorm.Open()
我想知道的是,当我调用它时,到底发生了什么?是每次调用它时都创建了一个新的连接池,还是每次调用gorm.Open()都共享同一个连接池?

b4lqfgs4

b4lqfgs41#

**TLDR:**是,尝试重新使用返回的DB对象。

gorm.open执行以下操作:(或多或少):
1.查找给定方言的驱动程序
1.调用sql.Open以返回DB对象
1.调用DB.Ping()以强制它与数据库通信
这意味着为每个gorm.Open创建一个sql.DB对象。根据文档,这意味着为每个DB对象创建一个连接池。
这意味着对sql.Open的建议适用于gorm.Open
返回的数据库对于多个goroutine的并发使用是安全的,并且维护着它自己的空闲连接池,因此Open函数应该只被调用一次,很少有必要关闭一个数据库。

muk1a3rh

muk1a3rh2#

是的,还要注意,在GORM v1和v2中,连接池都可以这样配置:

// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
db.DB().SetMaxIdleConns(10)

// SetMaxOpenConns sets the maximum number of open connections to the database.
db.DB().SetMaxOpenConns(100)

// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
db.DB().SetConnMaxLifetime(time.Hour)

*gorm.DB示例调用DB()函数将返回基础*sql.DB示例。

xhv8bpkk

xhv8bpkk3#

对于那些刚开始使用gorm的人,这里有一个更完整的例子。

db, err := gorm.Open(mysql.Open(url))
if err != nil {
    // control error
}

sqlDB, err := db.DB()
if err != nil {
    // control error
}

sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)

相关问题