2016-11-10 11 views
0

Я новичок в Golang/Postgres, и я делаю некоторые тесты и получаю pq: извините, слишком много клиентов уже ошибка. Мой Postgres экземпляр устанавливается на максимум 100 соединений, и я получаю эту ошибку в этом кодеgolang postgres too many connections error

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 записей в базу данных с другим идентификатором профиля для тестирования.

+3

Вы не выполняете 'on.Close' во время цикла. – JimB

+0

не имеет смысла создавать только одну группу WaitGroup и только ждать. Также я хочу представить вам https://play.golang.org/, чтобы вы могли форматировать свой код, а затем люди могут помочь вам намного лучше. В последнем случае вы должны выполнить 'sql.Open()' только один раз во всем своем коде, открывать и закрывать соединения подразумевает создание и уничтожение пула соединений. –

+0

Спасибо, JimB, что именно то, что не хватало отсрочки, вызвало утечку ресурсов и будет использовать это сейчас для форматирования моего кода –

ответ

1

НЕ используйте отложенный цикл. Потому что он будет выполняться, когда функция вернется.