2016-11-10 67 views
0

我是新来的Golang/Postgres,我正在做一些测试,得到一个pq:对不起,太多客户已经错误。我的Postgres的实例设置为100个连接的最大,我收到这个错误在此代码golang postgres太多的连接错误

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() 

}

我本质插入10000条记录与测试不同的配置文件ID数据库。

+3

你在循环中没有执行'on.Close'。 – JimB

+0

没有意义只创建一个WaitGroup,只是等待。另外我想向你介绍https://play.golang.org/,这样你就可以设置你的代码的格式,然后人们可以更好地帮助你。最后的考虑你应该只在你的所有代码中执行'sql.Open()',打开和关闭连接意味着创建和销毁连接池。 –

+0

谢谢JimB,这正是缺少延迟导致资源泄漏,现在将使用它来格式化我的代码 –

回答

1

请勿在循环中使用延迟。 因为它将在函数返回时执行。