golang postgres连接太多错误

Posted

技术标签:

【中文标题】golang postgres连接太多错误【英文标题】:golang postgres too many connections error 【发布时间】:2016-11-10 00:24:55 【问题描述】:

我是 Golang/Postgres 的新手,我正在做一些测试并收到 pq: sorry, too many clients already 错误。我的 postgres 实例设置为最多 100 个连接,我在此代码中收到该错误

    for i := 0; i < 10000; i++ 
    profile_id = profile_id+1
    on, err := db.Query("insert into streams (post,profile_id,created_on) values ($1,$2,$3)", post, profile_id, created_on)
    defer on.Close()

    if err != nil 
        fmt.Fprintln(w, "-1")
        log.Fatal(err)
    

我通常可以插入大约 60 到 70 个插入,然后我得到那个错误。所有连接都来自 for 循环中的那个样本。我做错了什么,这是我的完整代码。据我所知,1 个连接可以容纳许多不同的查询,所以我不知道为什么它只给我 60 到 70 个插入然后得到错误。

func Insert_Stream(w http.ResponseWriter, r *http.Request) 


wg := sync.WaitGroup
wg.Add(1)


go func()
    defer wg.Done()

db, err := sql.Open("postgres", Postgres_Connect)
if err != nil 
    log.Fatal(err)
    println(err)


defer db.Close()

r.ParseForm()
post := r.FormValue("post")
profile_id,err := strconv.Atoi(r.FormValue("profile_id"))
created_on := time.Now()
for i := 0; i < 10000; i++ 
    profile_id = profile_id+1
    on, err := db.Query("insert into streams (post,profile_id,created_on) values ($1,$2,$3)", post, profile_id)
    defer on.Close()

    if err != nil 
        fmt.Fprintln(w, "-1")
        log.Fatal(err)
    


fmt.Fprintln(w, "1")

()
wg.Wait()

我实际上是将 10,000 条记录插入到具有不同配置文件 ID 的数据库中以进行测试。

【问题讨论】:

你没有在循环期间执行on.Close 只创建一个 WaitGroup 并只等待是没有意义的。另外我想向您介绍play.golang.org,这样您就可以格式化您的代码,然后人们可以更好地帮助您。最后考虑一下,您应该在所有代码中只执行一次sql.Open(),打开和关闭连接意味着创建和销毁连接池。 谢谢 JimB 这正是缺少延迟导致资源泄漏的原因,现在将使用它来格式化我的代码 【参考方案1】:

不要在循环中使用 defer。 因为它会在函数返回时执行。

【讨论】:

以上是关于golang postgres连接太多错误的主要内容,如果未能解决你的问题,请参考以下文章

使用gorm的postgres中的“$ 1”或附近的golang语法错误

Postgres 术语:客户端与连接

Postgres - 连接三个表并在查询中对数据使用聚合函数

Postgres - 删除连接,使用给出错误

错误:不能为不可为空的 postgres 返回 null

postgres 上的错误转换连接