2016-11-10 3 views
0

Ich bin neu in Golang/Postgres und ich tue einige Tests und bekomme eine pq: sorry, zu viele Kunden bereits Fehler. Meine Postgres-Instanz zu einem Maximum von 100 Verbindungen herstellen und ich erhalte, dass Fehler in diesem Codegolang postgres zu viele Verbindungen Fehler

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

ich in der Regel dann in etwa 60 bis 70 Einsätzen bekommen kann ich diesen Fehler. Alle Verbindungen stammen von diesem einen Sample für die For-Schleife. Was kann ich falsch machen? Hier ist mein vollständiger Code. Soweit ich weiß 1 Verbindung kann viele verschiedene Abfragen enthalten, so dass ich nicht weiß, warum es nur gibt mir 60 bis 70 Einsätze dann den Fehler bekommen.

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

}

Ich bin Einfügen im Wesentlichen 10.000 Datensätze in die Datenbank mit einer anderen Profil-ID für die Prüfung.

+3

Während der Schleife wird kein 'on.Close' ausgeführt. – JimB

+0

macht keinen Sinn, nur eine WaitGroup erstellen und nur warten. Außerdem möchte ich Ihnen https://play.golang.org/ vorstellen, damit Sie Ihren Code formatieren können und die Leute Ihnen dann viel besser helfen können. Letzte Überlegung, Sie sollten eine 'sql.Open()' nur einmal in Ihrem gesamten Code tun, öffnen und schließen Verbindungen bedeutet erstellen und zerstören Pool von Verbindungen. –

+0

Vielen Dank JimB, das ist genau das, was fehlte die Verschiebung verursacht ein Ressourcen-Leck und wird das jetzt verwenden, um meinen Code zu formatieren –

Antwort

1

Verwenden Sie KEINE Verzögerung in Schleife. Weil es ausgeführt wird, wenn die Funktion zurückkehrt.

Verwandte Themen