2016-11-10 68 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

請勿在循環中使用延遲。 因爲它將在函數返回時執行。