Я новичок в 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 записей в базу данных с другим идентификатором профиля для тестирования.
Вы не выполняете 'on.Close' во время цикла. – JimB
не имеет смысла создавать только одну группу WaitGroup и только ждать. Также я хочу представить вам https://play.golang.org/, чтобы вы могли форматировать свой код, а затем люди могут помочь вам намного лучше. В последнем случае вы должны выполнить 'sql.Open()' только один раз во всем своем коде, открывать и закрывать соединения подразумевает создание и уничтожение пула соединений. –
Спасибо, JimB, что именно то, что не хватало отсрочки, вызвало утечку ресурсов и будет использовать это сейчас для форматирования моего кода –