【问题标题】:GORM pq too many connectionsGORM pq 连接太多
【发布时间】:2019-08-06 21:25:56
【问题描述】:

我在我的项目中使用 GORM,一切都很好,直到我收到一条错误消息:

pq: sorry, too many clients already

我只是使用默认配置。在我对我的应用程序做了很多测试请求之后发生了错误。

在我重新启动我的应用程序后,错误就消失了。所以,我认为在我完成查询后不会释放 GORM 连接。我对 GORM 代码的检查不够深入,我只是在这里问一下,也许有人已经体验过它?

【问题讨论】:

  • 您是创建多个连接,还是传递一个?
  • 你使用过 postgres 吗?如果是,请检查您的 server.properties 文件,并更新 MaxConnections 属性
  • @matt.s :我使用默认的,只是来自 GORM 文档。
  • @sbouaked :是的。我需要检查什么?
  • 在 ubuntu 上打开 /etc/postgresql/9.1/main/postgresql.conf 并升级“MaxConnections”属性。 stackoverflow.com/questions/30778015/…

标签: go go-gorm


【解决方案1】:

您收到的错误消息是 PostgreSQL 错误,而不是 GORM。这是由于您多次打开数据库连接造成的。

db, err := gorm.Open("postgres", "user=gorm dbname=gorm")

应该启动一次,然后再引用。

【讨论】:

  • 你不认为这应该由 GORM 自动完成吗?
  • 你根本不使用 Postgresql 吗?我想这应该由 GORM 完成(但不能肯定地说)。
  • 我正在使用 Postgresql。现在我推迟一个 DB.close GORM 上每个打开的新连接。
  • 所以,我应该调用一次 db, err := gorm.Open("postgres", "user=gorm dbname=gorm") 一次?并在我的整个应用程序中使用单个数据库?这在多线程应用程序上安全吗?
  • 已经将其更改为单数据库连接,到目前为止一切顺利。我认为您可以在上面更新您的答案,我会接受您的答案。非常感谢
【解决方案2】:
sync.Once.Do(func() {
    instance, err := gorm.Open("postgres",
        "root:password@"+
            "tcp(localhost:3306)/rav"+
            "?charset=utf8&parseTime=True")
    if err != nil {
        log.Println("Connection Failed to Open")
        return
    }
    log.Println("Connection Established here")
    instance.DB().SetMaxIdleConns(10)
    instance.LogMode(true)
})

您可以将连接限制为单例函数,以便连接发生一次,即使它被多次调用。

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 2021-02-18
    • 2011-07-13
    • 2013-05-09
    • 2018-08-04
    • 2017-12-27
    • 2011-03-05
    • 2014-07-22
    相关资源
    最近更新 更多