【问题标题】:Does gorm.Open() create a new connection pool every time it's called?gorm.Open() 每次调用时都会创建一个新的连接池吗?
【发布时间】:2020-05-15 15:32:20
【问题描述】:

我正在编写一段代码,该代码从几个不同的地方调用数据库。在这段代码中,我一直在使用 GORM 库,并在每次需要与数据库交互时调用gorm.Open()

我想知道的是,当我调用它时,幕后发生了什么?每次调用都会创建一个新的连接池,还是每次调用gorm.Open() 共享同一个连接池?

【问题讨论】:

  • 每次使用默认配置调用gorm.Open()时都会创建一个新的连接池。建议在您的应用程序中使用单个 *gorm.DB,方法是将其保存在全局变量中或为其创建单例模式。

标签: mysql go go-gorm


【解决方案1】:

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

gorm.Open 执行以下操作:(或多或少):

  1. 查找给定方言的驱动程序
  2. 调用sql.Open返回一个DB对象
  3. 调用DB.Ping() 强制它与数据库对话

这意味着为每个gorm.Open 创建一个sql.DB 对象。根据doc,这意味着每个数据库对象都有一个连接池。

这意味着sql.Open 的建议适用于gorm.Open

返回的数据库对于多个 goroutine 并发使用是安全的,并且 维护自己的空闲连接池。因此,打开功能 应该只调用一次。很少需要关闭数据库。

【讨论】:

    【解决方案2】:

    是的,还请注意,在 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 实例。

    【讨论】:

      猜你喜欢
      • 2020-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      相关资源
      最近更新 更多